我们目前正在开发一个连接四游戏作为大学项目,我必须处理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);
}
}
这些组件将添加到带有gridlayout的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]);
}
}
要捕获所有状态更改,我在播放字段上使用的2d数组上使用监听器,然后通知我的视图。在视图中,我将使用重绘来显示更改。
然而,当我对阵KI时,只有在KI完成后才会对场地进行绘制。当我用#34; paint&#34; -method调用它时,这个问题似乎并不存在(我不应该使用它,只是为了看看绘制调用是否有效)
我也只刷新我的JPanel而不是我的JFrame,并尝试使用JComponent而不是Component,但都无济于事。
我还要说AI是一个占用CPU的时间。可能因为忙于AI而不能执行该事件吗?
我知道&#34; Thread.sleep&#34;将关闭EDT因此不推荐。一旦用户点击并完成AI,我该怎么做才能进行两次刷新?
目前我在&#34; playArea&#34;上调用repaint()我认为是正确的。我愿意学习;)
答案 0 :(得分:1)
不要混合挥杆和awt。更改您的类以扩展JComponent
public class GameStone extends JComponent
并覆盖paintComponent()
方法,而不是paint()