小编典典

循环重涂

java

我正在使用Java
Swing编写游戏。我想在每次循环执行时绘制一下,并在之间稍加延迟以在屏幕上创建级联效果。我相信系统中的效率例程会将调用折叠repaint()为一个调用。无论如何,所有更改都在总延迟后立即发生。是否有某种方法可以强制系统立即重新绘制,然后在循环的每次迭代中延迟?

我的代码:

for(int i=0;i<10;i++){
    JButton[i].setBackground(Color.WHITE);
    JButton[i].repaint();
    Thread.sleep(2000);
    JButton[i].setBackground(Color.GRAY);
    JButton[i].repaint();
}

阅读 222

收藏
2020-09-16

共1个答案

小编典典

您可以JComponent.paintImmediately用来强制立即重绘。

编辑:再次阅读您的问题后,对我来说,您可能正在事件分发线程上执行逻辑。这意味着直到您的方法返回后,才会执行重画请求。如果将代码放入另一个线程中,则可能会解决问题,并且比使用更好paintImmediately

void uiFunction() {
    new Thread() {
        public void run() {
            for(int i = 0; i < 10; i++) {
                final JButton b = buttons[i];
                SwingUtilities.invokeLater(new Runnable() {
                    b.setBackground(Color.WHITE);
                    b.repaint();
                }
                Thread.sleep(2000);
                SwingUtilities.invokeLater(new Runnable() {
                    b.setBackground(Color.GRAY);
                    b.repaint();
                }
            }
        }
    }.run();
}

这有点麻烦,但希望它可以让您了解从哪里开始。

2020-09-16