java - Repaint方法更新太慢

标签 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);


}
}

这些组件将添加到带有网格布局的 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/

相关文章:

java - 如何使 AWT 组件在渐进式背景图像上透明?使用了 Window()、Panel()、Button() 但失败了

Java GUI多项选择程序

user-interface - .hta 文件是一个好的选择吗?

jquery - jquery 可排序的奇怪错误 : is not a function

java - Spring mvc 拦截器异常

java - 将图像存储在 SharedPreferences 中

java - 查询数据库内 Spinner 上的项目 - Android

java - 在 java jframe 中结束行并继续

java - 单击其他地方时如何隐藏 Swing Popup

java - JApplet - 不允许使用字母表