Java CardLayout性能异常排查:代码问题还是其他因素?
代码导致的CardLayout性能问题(窗口关闭延迟、拖动屏幕混乱)解决方案
你的问题完全由代码错误导致,核心问题出在Board类的绘制逻辑上,以下是具体问题和修复方案:
核心问题分析
- 无限重绘循环:
Board类的paint方法末尾调用了repaint(),这会触发系统持续调用paint方法,形成无限循环,耗尽CPU资源,直接导致窗口关闭延迟、拖动时系统卡顿甚至屏幕渲染混乱。 - 错误重写绘制方法:Swing的
JPanel应该重写paintComponent(Graphics g)而非paint(Graphics g),paint方法负责统筹组件的整个绘制流程(包括边框、子组件等),直接重写会破坏Swing的绘制机制。 - 未执行父类绘制逻辑:即使误用
paint方法,也必须调用super.paint(g)来完成组件的基础绘制工作,否则会出现绘制残留、组件状态异常等问题。
修复后的代码
修正后的Board类
import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Stroke; import javax.swing.JPanel; public class Board extends JPanel { public Board(){ setFocusable(true); } // 重写paintComponent而非paint方法 @Override protected void paintComponent(Graphics g) { // 调用父类方法完成基础绘制(清除旧内容、更新组件状态) super.paintComponent(g); g.setColor(Color.DARK_GRAY); g.fillRect(0, 0, getWidth(), getHeight()); // 使用组件自身尺寸而非固定值,适配窗口变化 g.setColor(Color.WHITE); g.drawRect(20, 20, 864, 624); g.setColor(Color.BLACK); g.fillRect(21, 21, 863, 623); g.setColor(Color.WHITE); g.setFont(new Font("arial", Font.PLAIN, 14)); // 调用自定义的board绘制方法 board(g); } public void board(Graphics g) { Graphics2D g2d = (Graphics2D) g; Stroke stroke1 = new BasicStroke(4f); g2d.setColor(Color.white); g2d.setStroke(stroke1); g2d.drawRect(20, 50, 850, 600); float[] dashingPattern2 = {10f, 4f}; Stroke stroke2 = new BasicStroke(4f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1.0f, dashingPattern2, 0.0f); g2d.setStroke(stroke2); g2d.drawLine(448, 50, 448, 650); g.setFont(new Font("arial", Font.PLAIN, 30)); } }
主类的小优化(可选)
给添加到CardLayout的Board组件指定名称,方便后续切换管理:
// 原代码 cPane.add(board); // 修改为 cPane.add("board", board);
修复效果说明
- 移除
repaint()调用后,彻底终止无限重绘循环,CPU占用会恢复正常水平。 - 使用
paintComponent并调用super.paintComponent(g),修复了Swing绘制机制的破坏问题,窗口拖动、关闭等操作会恢复流畅,不会再出现屏幕混乱的情况。
内容的提问来源于stack exchange,提问作者Jon doe
相关产品推荐
相关产品推荐

