我有一些带有图像的图形用户界面。我按下之后 一个按钮,我更改此图像并重新绘制整个图形用户 接口。这非常好。
为了向您展示我在这里做了一个小的可视化。我有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来重绘 经过一段时间后?
答案 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。您将找到有关挥杆,线程和事件的非常有用的解释。