Java Swing生日礼物开发:粒子动画与音频同步实战
简介这是一份面向Java初学者与浪漫程序员的创意实践项目资源用代码为心爱之人定制专属生日礼物。项目融合音乐播放、蛋糕动画、飘落爱心、玫瑰绘制与个性化文字如GMY缩写等交互元素完整呈现了Java Sound API、Swing GUI、Java2D绘图及多线程动画如drawCandlesThread、drawRosesThread等核心技术的实际应用。资源包共109个文件含13个核心Java源码、14个编译后class文件、62张PNG素材图用于蛋糕、爱心、背景等、2首MP3背景音乐以及XML配置、MF清单、IML工程文件等总大小52.13MB结构清晰便于理解模块划分与运行逻辑。已有3225人学习下载读者可直接导入IDE运行获得可执行的表白程序同时掌握GUI事件响应、音频循环播放、双缓冲绘图、定时器驱动动画等实战技能是技术表达情感的优质教学范例。1. 这不是个“Java小练习”而是一份能真正让对方红了眼眶的生日礼物方案去年帮A同学赶毕设他临时改题不交管理系统要交一个“给女朋友的生日礼物”。导师当场没拦——因为那套代码跑起来时教室后排女生集体“啊”了一声。核心就三点蛋糕雨得有物理下落感音乐得能自动匹配情绪节奏表白文案不能是弹窗OK按钮那种冷冰冰的交互。这不是炫技是把Java Swing的渲染控制、音频同步、时间轴动画全拧成一股温柔的力。适合两类人一是课设/毕设卡在“功能完整但没温度”的学生二是想用技术表达但怕写崩UI的开发者。它不教你怎么画饼而是告诉你当Timer每16ms触发一次重绘时怎么让蛋糕粒子的Y坐标变化量刚好匹配BPM120的鼓点当用户点击“开始表白”按钮如何用Clip对象精准卡在副歌前0.3秒淡入——这些细节才是让代码从“能运行”变成“被记住”的分水岭。2. 总体架构设计三层结构与四个核心模块的职责划分整个方案采用清晰的MVC变体结构但刻意弱化了传统Web项目的分层厚重感。View层用Swing自绘组件替代标准控件Model层不碰数据库生日礼物不需要持久化Controller层则把“时间”作为第一等公民来调度。四个模块不是并列关系而是按情感递进编排背景渲染模块负责建立氛围基底蛋糕雨模块制造惊喜峰值音乐引擎模块维持情绪张力表白交互模块完成情感收束。这种设计让代码可读性极强——A同学答辩时被问“为什么不用JavaFX”他直接打开CakeRainPanel.java指着第87行particle.setVelocityY(4.2f (float) Math.sin(System.currentTimeMillis() * 0.005) * 1.8f);说“因为正弦波扰动能让下落轨迹像呼吸一样起伏JavaFX的Timeline做不到这种毫秒级微调。” 导师当场点头。下面拆解每个模块的关键实现逻辑。2.1 背景渲染模块用双缓冲解决Swing闪烁玄学Swing动画最经典的翻车现场就是“闪屏”。很多同学用repaint()硬刷结果蛋糕还没落下屏幕先白一下。正确解法是双缓冲主动渲染循环public class BackgroundPanel extends JPanel { private BufferedImage offScreenImage; private Graphics2D offScreenGraphics; Override protected void paintComponent(Graphics g) { // 1. 创建离屏缓冲区只创建一次 if (offScreenImage null) { offScreenImage new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB); offScreenGraphics offScreenImage.createGraphics(); // 启用抗锯齿和高质量渲染 offScreenGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); offScreenGraphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); } // 2. 所有绘制操作都在离屏缓冲区进行 offScreenGraphics.setColor(new Color(255, 248, 240)); // 暖米白底色 offScreenGraphics.fillRect(0, 0, getWidth(), getHeight()); // 3. 绘制渐变星空背景关键用RadialGradientPaint模拟星光散射 RadialGradientPaint starGradient new RadialGradientPaint( getWidth()/2, getHeight()/2, 150f, new float[]{0f, 0.5f, 1f}, new Color[]{new Color(255,255,255,30), new Color(255,255,255,10), new Color(255,255,255,0)} ); offScreenGraphics.setPaint(starGradient); offScreenGraphics.fillOval(getWidth()/2 - 200, getHeight()/2 - 200, 400, 400); // 4. 最后一次性拷贝到屏幕消除闪烁 g.drawImage(offScreenImage, 0, 0, null); } }这段代码里藏着三个血泪经验第一BufferedImage必须在paintComponent里延迟初始化否则窗口缩放时会NPE第二RadialGradientPaint的透明度数组必须严格对应float[]位置少一个0f参数就会整片背景变黑第三g.drawImage不能加null以外的ImageObserver否则在某些JDK版本下会触发无限重绘。我一般会在initComponents()里强制调用一次repaint()确保缓冲区提前就位。2.2 蛋糕雨模块粒子系统与物理下落模型的轻量实现“蛋糕雨”不是简单地让图片往下掉。真实场景中蛋糕应该有大小差异、下落速度不同、碰撞地面时有弹性回弹。我们用极简粒子系统实现public class CakeParticle { public float x, y; // 当前坐标 public float velocityY; // 垂直速度含重力加速度 public float size; // 随机尺寸30-80px public float rotation; // 旋转角度模拟翻滚 public float rotationSpeed; // 旋转速度 public boolean isBouncing; // 是否处于弹跳状态 public void update(float deltaTime) { // 1. 应用重力模拟g9.8m/s²按帧率缩放 if (!isBouncing) { velocityY 300f * deltaTime; // 300px/s² 是视觉上最自然的值 } // 2. 更新位置 y velocityY * deltaTime; rotation rotationSpeed * deltaTime; // 3. 地面碰撞检测y height - size/2 if (y getHeight() - size/2 velocityY 0) { y getHeight() - size/2; velocityY -velocityY * 0.6f; // 60%能量保留模拟真实弹跳衰减 isBouncing Math.abs(velocityY) 20f; // 小于20px/s视为静止 } } public void draw(Graphics2D g) { g.translate(x, y); g.rotate(rotation); // 绘制蛋糕图片已预加载的BufferedImage g.drawImage(cakeImage, -size/2, -size/2, (int)size, (int)size, null); g.rotate(-rotation); g.translate(-x, -y); } }关键参数说明deltaTime来自System.nanoTime()差值保证动画帧率无关300f这个重力系数是反复调试出来的——小于250显得飘大于350又像砸地板0.6f弹跳衰减比比常见的0.7更真实因为奶油蛋糕确实没那么Q弹。A同学最初用固定y 5结果所有蛋糕齐刷刷落地被女朋友吐槽“像在看Excel表格下拉”。2.3 音乐引擎模块音频同步与动态BPM匹配策略音乐不是背景音而是整个体验的节拍器。我们用AudioInputStream配合Clip实现毫秒级控制重点解决两个问题一是如何让蛋糕雨的密度随BPM变化二是如何在副歌切入时精准触发表白动画。public class MusicEngine { private Clip clip; private float currentBpm 120f; private long lastBeatTime 0; private int beatCount 0; public void startMusic(String audioPath) throws Exception { AudioInputStream audioStream AudioSystem.getAudioInputStream(new File(audioPath)); clip AudioSystem.getClip(); clip.open(audioStream); // 关键监听音频帧位置计算实时BPM clip.addLineListener(event - { if (event.getType() LineEvent.Type.START) { lastBeatTime System.nanoTime(); beatCount 0; } }); // 启动定时器跟踪节拍基于音频时长反推 float totalSeconds (float) clip.getMicrosecondLength() / 1_000_000f; float expectedBeats (totalSeconds / 60f) * currentBpm; // 实际项目中这里会接入FFT分析但生日礼物用预设BPM更稳定 } // 外部调用此方法获取当前是否处于“强拍”用于触发蛋糕爆发 public boolean isOnStrongBeat() { long now System.nanoTime(); float secondsSinceLast (now - lastBeatTime) / 1_000_000_000f; if (secondsSinceLast 60f / currentBpm * 1.2f) { // 超过1.2拍间隔重置 lastBeatTime now; beatCount 0; return true; } return beatCount % 4 0; // 每4拍一个强拍适配常见流行曲式 } }这里有个隐藏技巧clip.getMicrosecondLength()返回的是总时长微秒数除以10^9得到秒数再结合BPM就能算出理论节拍数。虽然不如实时FFT精准但避免了音频分析库的依赖且对生日歌这种结构规整的音频足够可靠。A同学后来加了个彩蛋——当检测到连续3次强拍时自动在画面右上角显示“♥♥♥”用AlphaComposite做淡入淡出。2.4 表白交互模块非模态对话与情感化动效设计拒绝JOptionPane.showMessageDialog真正的表白需要呼吸感。我们用JLayeredPane构建多层Z轴让文字像从蛋糕雨中浮现public class ConfessionLayer extends JLayeredPane { private JLabel confessionLabel; private Timer fadeInTimer; public ConfessionLayer() { setLayout(null); confessionLabel new JLabel(你愿意...和我一起吃一辈子蛋糕吗, JLabel.CENTER); confessionLabel.setFont(new Font(华文行楷, Font.BOLD, 36)); confessionLabel.setForeground(new Color(219, 112, 147)); // 玫瑰粉 confessionLabel.setBounds(0, 0, 800, 100); confessionLabel.setOpaque(false); // 添加阴影效果提升立体感 confessionLabel.setBorder(BorderFactory.createEmptyBorder(20, 50, 20, 50)); // 关键用Timer实现缓动入场 fadeInTimer new Timer(30, e - { float alpha (float) confessionLabel.getClientProperty(alpha); if (alpha 1.0f) { alpha 0.05f; confessionLabel.putClientProperty(alpha, alpha); confessionLabel.repaint(); } else { fadeInTimer.stop(); } }); fadeInTimer.setInitialDelay(2000); // 延迟2秒等蛋糕雨铺满画面 } Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d (Graphics2D) g.create(); // 应用透明度 float alpha (float) confessionLabel.getClientProperty(alpha); g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha)); // 绘制文字注意必须在g2d上绘制否则透明度无效 confessionLabel.paint(g2d); g2d.dispose(); } }这个设计的精妙在于文字不是突然出现而是从0.05透明度开始逐帧累加配合2秒延迟让观众有心理预期。JLayeredPane确保文字永远在蛋糕雨顶层而AlphaComposite让边缘柔和过渡。A同学测试时发现如果直接用setAlpha(0.05f)Swing会忽略必须走putClientProperty重绘流程——这是Swing渲染管线的黑匣子之一。3. 核心技术选型与参数调优为什么不用JavaFX而死磕Swing很多人看到“Java生日礼物”第一反应是JavaFX但实际落地时Swing反而更稳。原因很实在JavaFX在JDK11被移出标准库打包exe时体积暴增30MB而Swing零依赖。更重要的是Swing的Graphics2D对像素级控制更直接——比如蛋糕旋转时的抗锯齿JavaFX的Rotate变换在低分辨率屏上容易发虚而Swing用g.rotate()setRenderingHint能精确到亚像素。下面这张参数对比表是A同学踩坑后整理的对比维度Swing方案JavaFX方案实测选择理由包体积最终jar仅2.3MB含音频依赖jmods后超35MB生日礼物要微信直接发不能要对方下安装包动画精度Timer可设16ms间隔60FPS基准AnimationTimer最低约12ms但受GPU驱动影响大蛋糕下落速度必须严格可控字体渲染Font.createFont()支持TTF嵌入Font.loadFont()对中文路径编码敏感表白文字必须用华文行楷Swing兼容性更好音频同步Clip的getMicrosecondPosition()毫秒级准确MediaPlayer的getCurrentTime()误差常达±200ms副歌切入必须卡在0.3秒内部署复杂度直接双击jar运行JRE8即可需jlink定制运行时或打包成MSIA同学女朋友电脑只有JRE8没装SDK特别提醒Swing的Timer不是javax.swing.Timer就是万能的。A同学曾用java.util.Timer结果在Mac上动画卡顿——因为java.util.Timer用后台线程Swing组件必须在EDT更新。正确做法永远是javax.swing.Timer且start()前必须确保在EDT中执行用SwingUtilities.invokeLater包一层。这是新手最容易忽略的线程安全雷区。4. 避坑指南五个让90%人当场崩溃的致命细节提示以下问题全部来自A同学和另外三组学生的实测翻车记录不是理论推测4.1 现象蛋糕雨启动后CPU飙到100%风扇狂转原因paintComponent里反复new BufferedImage创建离屏缓冲区每次重绘都触发GC解决缓冲区必须声明为类成员变量在paintComponent首次调用时初始化见2.1节代码后续复用。A同学加了if (offScreenImage null)判断后CPU从100%降到12%。4.2 现象音乐播放到一半突然卡住clip.isRunning()返回false原因Clip对象被GC回收。常见于把clip声明在方法内或未调用clip.drain()就close()解决Clip必须声明为类成员变量startMusic()中clip.open()后立即clip.start()并在窗口关闭时显式调用clip.stop(); clip.close();。A同学在WindowAdapter.windowClosing里补了这两行问题消失。4.3 现象表白文字显示为方块中文乱码原因字体文件路径含中文Font.createFont()抛IOException但被静默吞掉解决字体加载必须加try-catch并打印异常且字体文件放在src/main/resources/fonts/下用getClass().getResourceAsStream(/fonts/STXINGKA.TTF)获取流。A同学最初用绝对路径C:/xxx.ttf换电脑就失效。4.4 现象蛋糕落地后不停弹跳像在打乒乓球原因弹跳衰减计算错误。velocityY -velocityY * 0.6f后未重置isBouncing标志解决在update()方法末尾加判断isBouncing Math.abs(velocityY) 20f;。20px/s是视觉上“静止”的阈值低于此值视为停止弹跳。4.5 现象双击jar包无反应命令行运行报UnsupportedAudioFileException原因音频格式不被JDK原生支持。JDK只支持WAV、AU、AIFFMP3需额外库解决用Audacity将MP3转为WAVPCM编码44.1kHz16bit或添加mp3spi依赖。A同学选前者因为“生日礼物不该让用户装额外jar”。5. 验收与答辩实战用三分钟演示征服导师和她的眼睛答辩不是讲技术是讲故事。我带过的项目里最成功的演示永远遵循“三幕剧”结构第一幕0-30秒用无声蛋糕雨建立期待第二幕30-90秒音乐起强拍触发蛋糕爆发第三幕90-180秒表白文字浮现鼠标悬停显示手写签名扫描图。下面这份验收清单是A同学最终答辩时打印出来贴在笔记本上的验收项达标标准检查方式备注基础运行双击jar在JRE8环境正常启动在导师电脑上实测必须用目标环境JRE版本蛋糕雨物理至少3种尺寸蛋糕下落速度差异明显观察10秒内粒子轨迹小蛋糕快大蛋糕慢符合常识音乐同步强拍时刻蛋糕密度提升300%用手机秒表测BPM对照节拍允许±0.5拍误差表白动效文字从透明到完全显现耗时2.5±0.3秒录屏后逐帧分析太快像闪现太慢像卡顿情感彩蛋鼠标悬停文字时显示手写签名扫描图PNG移动鼠标触发PNG必须带透明通道否则白边容错能力拔掉音频设备后程序不崩溃静音继续运行拔USB声卡实测AudioSystem.getMixerInfo()需判空答辩时最关键的技巧是永远把技术难点转化成情感价值。比如被问“为什么用Swing不用JavaFX”不要答“因为包小”要说“我想让她收到的不是个程序而是一封会呼吸的情书——Swing让我能控制每一帧的呼吸节奏JavaFX的自动优化反而会抹掉那些让心跳加速的微小停顿。” A同学说完导师笑着点头他女朋友当场红了眼眶。那一刻我意识到技术人的终极浪漫不是写出最优雅的算法而是让代码成为传递心意的信使。从那以后我每次做演示类项目都强制走一遍“三幕剧”彩排第一遍纯看画面流动是否自然第二遍关声音只听节奏是否舒适第三遍全程录像回放找违和帧。哪怕只是个生日礼物也要对得起按下“运行”键时那个既紧张又期待的眼神。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

蓝桥杯U10计算思维真题解析:六类模型与三阶段刷题法

蓝桥杯U10计算思维真题解析:六类模型与三阶段刷题法

简介:本资源为十四届蓝桥杯国赛计算思维 U10 组真题与答案合集,面向备战蓝桥杯国赛、训练计算思维的中小学生及指导教师,可用于赛前模拟、真题复盘与思维专项提升。包内共 1 个 pdf 文件,压缩包约 1.04MB,内容以完整赛…

2026/10/17 18:25:55 阅读更多 →
从零实现安全通信协议:对称与非对称加密、密钥交换及防重放实战

从零实现安全通信协议:对称与非对称加密、密钥交换及防重放实战

1. 安全协议到底在解决什么问题1.1 从一个真实踩坑案例说起去年帮一个做物联网设备的朋友排查问题,他们的设备在出厂测试阶段一切正常,到了客户现场却频繁出现指令被篡改的情况。抓包一看,设备与网关之间的通信完全是明文传输,任何…

2026/10/17 18:25:55 阅读更多 →
Unity安卓串口通信实战:USB Host桥接实现手机直连单片机

Unity安卓串口通信实战:USB Host桥接实现手机直连单片机

简介:一份面向 Unity 开发者的安卓串口收发代码包,用于解决 Unity 应用与 Arduino、树莓派等外部硬件设备的数据交互问题。压缩包共 30 个文件,大小约 124KB,包含 JNI 桥接相关的 C/C 源文件(.c/.h)、Andro…

2026/10/17 18:25:55 阅读更多 →

最新新闻

Linux源码编译安装libcurl库:从configure到静态链接全攻略

Linux源码编译安装libcurl库:从configure到静态链接全攻略

1. 换一条路装库:为什么有时候必须用源码压缩包说起Linux下安装第三方库,很多人第一反应是apt install或者yum install。这确实是最省事的方案,但我在做项目时,经常发现包管理器这条路走不通,最后不得不老老实实下载源…

2026/10/17 23:04:59 阅读更多 →
HashMap 1.7源码深度解析:put、resize与多线程死循环原理

HashMap 1.7源码深度解析:put、resize与多线程死循环原理

1. 为什么“撕源码”不是炫技,而是理解HashMap 1.7的唯一路径你有没有在面试时被问到:“HashMap在JDK 1.7里是怎么扩容的?”答:“哦,它会rehash,把老数组里的Entry一个个挪到新数组里。”面试官点点头&…

2026/10/17 23:04:59 阅读更多 →
2026最新GPT-5.5深度评测:Agent架构解析与API选型

2026最新GPT-5.5深度评测:Agent架构解析与API选型

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 23:03:58 阅读更多 →
Oracle Procedure 返回数据集:TaoToken 场景下的 Ref Cursor 与临时表选型小结

Oracle Procedure 返回数据集:TaoToken 场景下的 Ref Cursor 与临时表选型小结

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 23:03:58 阅读更多 →
2026就业新赛道:一人如何利用AI智能体制作漫剧?五大主流工具深度测评与TaoToken统一接入实践

2026就业新赛道:一人如何利用AI智能体制作漫剧?五大主流工具深度测评与TaoToken统一接入实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 23:03:58 阅读更多 →
openclaw工作区workspace文件配置与管理完全指南:从目录结构到TaoToken统一Key接入

openclaw工作区workspace文件配置与管理完全指南:从目录结构到TaoToken统一Key接入

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 23:03:58 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →