1

我有一个带有一些图像的图形用户界面。按下按钮后,我更改此图像并重新绘制整个图形用户界面。这工作得很好。

为了向您展示我在这里所做的一个小型可视化。我有 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() 但这会冻结图形用户界面(我发现的事件调度程序线程的东西)

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

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

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

但有了它,什么都没有改变。它仍然非常快,我只看到了起源和最后的转变。

调用重绘我的所有摆动组件的方法称为“changeGUI()”

那么我如何才能真正实现在一定时间后重新绘制的功能呢?

  • 起源
  • 等一下
  • 第一次转型
  • 等一下
  • ……
4

3 回答 3

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();
于 2013-08-08T09:18:56.010 回答
0

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

invokeLater 没有效果,因为当您在按钮事件中调用它时,您已经在 EDT 上。然后您也将 changeGUI() 调用添加到 EDT。

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

于 2013-08-08T09:23:04.987 回答
0

您可以分享您的方法“changeGUI()”的代码吗?但请记住,所有绘图和 UI 更新都应通过 EDT(事件调度线程)进行。看看这篇文章。你会发现关于摇摆、线程和事件的非常有用的解释。

于 2013-08-08T09:26:17.007 回答