1

我正在制作一个游戏,其中包含正方形(面板网格),当游戏结束时,有一种算法会以“实时”方式逐个更改面板的颜色,用户可以看到正方形慢慢改变颜色。我尝试类似:

Thread.sleep(1000);      

grid.getComponent(boxNumber).setBackground(Color.YELLOW);

Thread.sleep(1000); 

grid.getComponent(boxNumber).setBackground(Color.ORANGE);

虽然盒子的颜色变成了黄色,但之后它并没有变成橙色。有人有想法么?希望我能说清楚。

4

3 回答 3

2

阅读 Swing并发教程中的部分,了解为什么不应该使用 sleep() 方法。

一种解决方案是使用 SwingWorker,然后您可以“发布”组件的颜色,以便它可以在 EDT 上正确更新,并且您也可以在 worker 中调用 sleep() 方法。

于 2011-12-29T16:38:09.210 回答
1

这些需要发生在 Swing 事件线程上。通过以下方式调用设置背景:

SwingUtilities.invokeLater(new Runnable() {
  public void run() {
    grid.getComponent(boxNumber).setBackground(Color.ORANGE);
  }
});

请注意,您Thread.sleep()应该在事件线程中(或直接来自 Swing 事件侦听器(ActionListener、WindowListener 等)。

查看专门用于此类事情的Swing Timing Framework也是谨慎的做法。

于 2011-12-29T16:30:06.883 回答
1

Thread.sleep(1000);- 通常在 EDT中做这件事不是一个好主意。您应该尝试使用Timers
- 你还需要revalidate()/validate() and repaint()事后打电话。

所以也许是这样的:

Timer yellowTimer = new Timer(1000,new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
             jtp.setBackground(Color.YELLOW);
            //call revalidate()/validate() and repaint() afterward
             jtp.revalidate();
             jtp.repaint();
        }
    });
yellowTimer.setRepeats(false);

Timer orangeTimer = new Timer(2000,new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
             jtp.setBackground(Color.ORANGE);
             //call revalidate()/validate() and repaint() afterward
             jtp.revalidate();
             jtp.repaint();
        }
    });
orangeTimer.setRepeats(false);

yellowTimer.start();
orangeTimer.start();
于 2011-12-29T16:41:57.433 回答