如何解决Java开发屏幕保护程序时浮动图像闪烁不动的问题
问题核心原因
你没有禁用JFrame的默认布局管理器,Swing的JFrame默认使用BorderLayout,你调用add(logo)时组件默认被添加到BorderLayout.CENTER区域,布局管理器会强制将组件固定在居中位置。你在update方法中手动调用setLocation修改位置后,布局管理器下一次重绘时会立刻将组件拉回居中位置,就表现为图形在中间闪烁、无法移动的现象。
修复步骤
- 第一步:在Protect类的构造方法中添加代码禁用默认布局,手动控制组件位置:
setLayout(null);
你可以把这行代码放在getContentPane().setBackground(PhoenixColors.BLACK);之后即可。
- 第二步:给logo设置初始位置(可选,优化体验),你当前的xLoc、yLoc默认初始值为0.0也可以运行,若要实现随机初始浮动位置,可以在
timer.start();之前添加如下代码:
// 等待窗口渲染完成获取正确宽高后设置初始位置 addNotify(); xLoc = Math.random() * (getWidth() - logo.getWidth()); yLoc = Math.random() * (getHeight() - logo.getHeight()); logo.setLocation((int)xLoc, (int)yLoc);
- 第三步:优化重绘逻辑(可选,减少闪烁),将update方法中的
repaint();替换为logo.repaint();,只重绘logo区域不需要重绘整个窗口,进一步降低闪烁概率。
额外可选优化
建议在构造方法中添加默认关闭操作配置,避免窗口关闭后Java进程残留:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
内容的提问来源于stack exchange,提问作者Troy Marker
相关产品推荐
相关产品推荐

