Java Swing使用paintComponent绘制Mühle游戏棋子不显示问题求解
问题原因与修复方案
核心问题:绘制坐标逻辑错误
Swing 组件的 paintComponent 方法中传入的 Graphics 上下文,坐标是相对于当前组件自身左上角的,而非相对于顶层窗口的全局坐标。你当前在 fillOval 方法中直接使用了存储全局位置的 this.x 和 this.y,相当于在大小仅 30x30 的棋子组件内部,从远超出组件范围的位置开始绘制圆形,自然不会有任何可见内容。
此外你在 paintComponent 中调用了 repaint(),会触发无限重绘,占用大量 CPU 资源,需要删除。
修复代码
修改 Steine 类的 paintComponent 方法即可:
protected void paintComponent(Graphics g){ super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setColor(this.farbe); // 改为组件内部相对坐标,从(0,0)开始绘制30x30的圆刚好铺满组件 g.fillOval(0, 0, 30, 30); }
额外优化建议
- 你自定义的
Steine类的x、y属性覆盖了父类JComponent自带的同名字段,容易导致逻辑混淆,后续可以考虑删除自定义的这两个属性,直接调用父类的getX()、getY()、setLocation()方法操作组件位置即可。 - 白色棋子在青色背景上对比度较低,后续可以给白色棋子增加深色边框,或者调整背景色提升识别度。
内容的提问来源于stack exchange,提问作者Florian Oschmann
相关产品推荐
相关产品推荐

