You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);

修复效果说明

  1. 移除repaint()调用后,彻底终止无限重绘循环,CPU占用会恢复正常水平。
  2. 使用paintComponent并调用super.paintComponent(g),修复了Swing绘制机制的破坏问题,窗口拖动、关闭等操作会恢复流畅,不会再出现屏幕混乱的情况。

内容的提问来源于stack exchange,提问作者Jon doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 13:50:27