2

我正在使用 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();
}
4

2 回答 2

6

您可以使用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();
}

这有点糊涂,但希望它能让你知道从哪里开始。

于 2010-11-08T01:00:44.803 回答
2

不确定我是否在正确的轨道上,但这是一个线程问题吗?因为睡眠将使当前线程进入睡眠状态。因此,如果重绘在当前线程上,您将有效地排队重绘,持有,然后排队另一个重绘。然后该方法结束,图形线程的事件处理循环触发,执行两次重绘(折叠),使一切同时发生。

基于这种想法,我认为您可能有两种选择:

  1. 将代码放在第二个线程上,这样它就不会停止主图形线程,也因为这意味着图形线程可以在睡眠发生的同时进行重新绘制。

  2. 在你睡觉之前(我认为不是真的推荐),触发事件循环以强制重绘发生。我得查一下这个。不记得该怎么做。:-)

我可能会将#1视为最佳选择。

于 2010-11-08T01:07:58.050 回答