Java在一段时间到期后更改Swing组件

时间:2013-08-08 09:16:24

标签: java swing

我有一些带有图像的图形用户界面。我按下之后 一个按钮,我更改此图像并重新绘制整个图形用户 接口。这非常好。

为了向您展示我在这里做了一个小的可视化。我有8张图片:

1. 2. 3. 4.
5. 6. 7. 8. 

按下按钮后,所有图像都会向左旋转步骤:

2. 3. 4. 8.
1. 5. 6. 7. 

3. 4. 8. 7.
2. 1. 5. 6. 

4. 8. 7. 6.
3. 2. 1. 5. 

好的,我们在这里。正如我已经提到的,这很好用! 在每一步之后,我重新绘制图形用户界面 但是当然这种情况发生得太快了,以至于你没有看到这些步骤 开始和结束之间。你只看到原点:

1. 2. 3. 4. 
5. 6. 7. 8. 

最后的转变

4. 8. 7. 6. 
3. 2. 1. 5.

但实际上我希望用户看到每一步。所以 我想我可以在每一步之后添加一个Thread.sleep() 但这会冻结图形用户界面(某些东西 使用Event Dispatcher Thread我发现了)

所以我试图把所有东西都放进去:

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        changeGUI();

        try {
            Thread.sleep(1000);
        } catch(InterruptedException e) {}
    }
}

但随之而来的是没有任何变化。它仍然非常快我 只看原点和最后的转变。

调用重新绘制所有挥杆组件的方法 被称为'changeGUI()'

那么我怎样才能真正实现functionallity来重绘 经过一段时间后?

  • origin
  • 等一下
  • 第一次转型
  • 等一下
  • ....

3 个答案:

答案 0 :(得分:4)

您要使用的是Swing Timer

在秋千线上睡觉会导致冰冻问题,这就是你正在做的事情。

示例:

import javax.swing.Timer;
...
final Timer print = new Timer(1000, new ActionListener(){

        @Override
        public void actionPerformed(final ActionEvent e){
            System.out.println("It's been 1 second!");
        }
});
print.start();

答案 1 :(得分:0)

你必须启动一个调用changeGUI()的新线程。

invokeLater没有效果,因为当你调用它时,例如在按钮事件中, 你已经在美国东部时间了。然后你也可以添加changeGUI() - 调用EDT。

构建自己的Thread或使用ThreadPoolExecutor启动另一个线程来调用 changeGUI();

答案 2 :(得分:0)

你可以分享你方法的代码" changeGUI()"? 但请记住,所有绘图和UI更新都应通过EDT(Event-Dispatch Thread)进行。看一下这个article。您将找到有关挥杆,线程和事件的非常有用的解释。