我们目前正在开发一款连四游戏作为大学项目,我必须处理 GUI。
为了解决这个问题,我为每个石头都有一个名为“GameStone”的自定义组件:
public class GameStone extends Component
{
private final int row;
private Color stoneColor;
public GameStone(int row, MouseListener mouse){
this.row = row;
this.addMouseListener(mouse);
this.stoneColor = Color.WHITE;
}
public int getRow(){
return row;
}
public void setColor(Color color){
this.stoneColor = color;
}
@Override
public void paint(Graphics g)
{
super.paint(g);
//fills the stones with the set color
g.setColor(stoneColor);
g.fillOval(5, 5, 25, 25);
// sets the border of the playstones
g.setColor(Color.BLACK);
g.drawOval(5,5 , 25, 25);
}
}
这些组件将添加到带有网格布局的 JPanel 中:
graphicField = new GameStone[7][6];
stoneListener = new GameStoneListener(gamecontrol);
GridLayout grid = new GridLayout(6, 7, 10, 10);
playArea.setLayout(grid);
for (int i = 5; i >= 0; i--)
{
for (int j = 0; j < 7; j++)
{
graphicField[j][i] = new GameStone(j, MouseListener);
playArea.add(graphicField[j][i]);
}
}
为了捕获所有状态更改,我在 Playground 上使用的二维数组上使用监听器,然后通知我的 View 。在 View 中我将使用重绘来显示更改。
但是,当我与 KI 比赛时,只有在 KI 完成后才会绘制比赛 field 。另外,当我用“paint”方法调用它时,问题似乎不存在(我不应该使用它,只是为了看看paint调用是否有效)
我也只刷新 JPanel 而不是 JFrame,也尝试使用 JComponent 而不是 Component,但都无济于事。
我还必须说的是,人工智能是一个占用 CPU 时间的人工智能。难道是AI忙,导致事件无法执行?
我知道“Thread.sleep”会关闭 EDT,因此不建议这样做。当用户点击和 AI 完成后,我该怎么做才能进行两次刷新?
目前我在“playArea”上调用 repaint() ,我认为这是正确的。不过我愿意学习;)
最佳答案
不要混合使用 swing 和 awt。更改您的类以扩展 JComponent
public class GameStone extends JComponent
并重写paintComponent()
方法而不是paint()
关于java - Repaint方法更新太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23696210/