重绘方法更新太慢

时间:2014-05-16 13:23:57

标签: java swing user-interface awt repaint

我们目前正在开发一个连接四游戏作为大学项目,我必须处理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()我认为是正确的。我愿意学习;)

1 个答案:

答案 0 :(得分:1)

不要混合挥杆和awt。更改您的类以扩展JComponent

 public class GameStone extends JComponent

并覆盖paintComponent()方法,而不是paint()