Java Swing国际象棋项目棋盘方块未绘制显示问题求助
问题1:paintComponent 方法逻辑错误
- 绘制坐标错误:Swing 组件的
paintComponent方法接收的Graphics上下文坐标是相对于当前组件自身的,你调用getX()、getY()获取的是组件在父容器中的偏移量,会导致绘制内容直接超出当前组件的可视区域,完全看不到绘制的方块。 - 多余的
repaint()调用:在paintComponent内部调用repaint()会触发无限重绘循环,占用大量CPU资源,还会导致绘制异常。 - 没有调用父类方法:自定义绘制前需要先调用
super.paintComponent(g)完成组件基础绘制的清屏等操作,避免出现拖影、背景异常问题。
修复后的paintComponent代码:
@Override public void paintComponent(Graphics g) { super.paintComponent(g); if((this.px + this.py) % 2 == 0) { g.setColor(Color.blue); } else { g.setColor(Color.cyan); } // 从组件自身左上角(0,0)开始绘制 g.fillRect(0, 0, this.getWidth(), this.getHeight()); }
问题2:棋盘格子的坐标计算错误
你将Spielfeld(棋盘格子)组件添加到GameEnvironment容器中,子组件的setBounds坐标是相对于父容器(也就是ge)的,不需要额外叠加ge.getX()、ge.getY()(这两个值是ge在父容器contentPane中的偏移量),叠加后会导致所有格子直接偏移出ge的1000x1000可视区域,自然无法显示。
修复后的createMap坐标设置代码:
// 去掉ge.getX()、ge.getY()的叠加 this.map[i][j].setBounds(j * Spielfeld.width, i * Spielfeld.height, Spielfeld.width, Spielfeld.height);
问题3:容器布局未适配绝对定位
如果你使用setBounds手动设置组件位置,需要确保父容器使用null绝对布局,否则默认的布局管理器会自动覆盖你设置的位置和尺寸,导致格子不显示。
需要在SchachFrame构造方法中添加对应布局设置:
public SchachFrame() { super(); contentPane = new JPanel(); contentPane.setLayout(null); // 新增:contentPane用绝对布局 setContentPane(contentPane); setBounds(0, 0, window.width, window.height); contentPane.setBackground(Color.darkGray); ge = new GameEnvironment(this); ge.setLayout(null); // 新增:GameEnvironment用绝对布局,才能让格子的setBounds生效 ge.setBounds(window.width/2 - 500, window.height/2 - 500, 1000, 1000); contentPane.add(ge); // 调用createMap生成棋盘后,新增以下代码刷新容器 ge.revalidate(); ge.repaint(); Thread gameEnvironment = new Thread(ge); gameEnvironment.start(); setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); }
内容的提问来源于stack exchange,提问作者warriorloewe
相关产品推荐
相关产品推荐

