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
相关产品推荐
相关产品推荐

