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

Java Swing象棋游戏开发:for循环绘制的矩形窗口启动后消失

问题分析与解决方案

问题根源

你把rectX和rectY定义为类的成员变量,第一次执行paintComponent时,循环会将这两个变量累加至rectX=0、rectY=800(刚好超出面板的800x800可视范围)。当Swing触发重绘操作(比如窗口移动、最小化恢复、组件刷新)时,paintComponent会再次执行,此时这两个变量保留了上次循环结束后的状态,导致所有矩形都绘制在可视区域外,看起来就像“消失”了。

修复方案

把rectX和rectY改为paintComponent方法内的局部变量,每次重绘都会重新初始化坐标;同时可以优化循环逻辑,用行和列的嵌套循环替代单循环,代码更直观易维护:

public class Main extends JPanel {
    
    private static JFrame frame;
    private static Container contentPanel;
    
    // draw game textures
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        
        // 每次重绘都重新初始化坐标
        int rectX = 0;
        int rectY = 0;
        
        // 按行和列嵌套循环绘制棋盘,更直观
        for (int row = 0; row < 8; row++) {
            for (int col = 0; col < 8; col++) {
                // 相邻格子颜色交替,行号+列号为奇数时填充深色
                if ((row + col) % 2 != 0) {
                    g.fillRect(rectX, rectY, 100, 100);
                } else {
                    g.drawRect(rectX, rectY, 100, 100);
                }
                rectX += 100;
            }
            rectX = 0;
            rectY += 100;
        }
    }
    
    // define preferred size
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(800, 800);
    }
    
    // create GUI
    private static void createAndShowGui() {
        Main main = new Main();
        
        frame = new JFrame("Java Chess V1.0");
        contentPanel = frame.getContentPane();
        contentPanel.add(main);
        
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}

额外说明

Swing的paintComponent方法会被系统频繁调用(比如组件大小变化、窗口遮挡后恢复),因此绝对不能依赖成员变量的状态来计算绘制参数,所有与绘制相关的临时变量都应该在方法内部初始化,确保每次重绘都是独立、正确的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:47:10