【发布时间】:2016-01-12 19:14:36
【问题描述】:
问题 当一个按钮被点击时,它需要弹出一个加载GIF,而执行的过程很长。该过程完成后,此弹出窗口会自动关闭。
我的方法
if (evt.getSource() == processButton) {
ImageIcon loading = new ImageIcon("img/loading.gif");
final JLabel loaderLabel = new JLabel("loading", loading, JLabel.CENTER);
Thread t = new Thread(new Runnable() {
@Override
public void run() {
ProcessFrame.this.frame.add(loaderLabel);
}
});
process(); // long process
loaderLabel.setVisible(false);
}
ProcessFrame 是用户与之交互的主要 JFrame。
我遇到了什么问题?
加载图像永远不会弹出(或至少作为标签)。关注了一些关于 SO 的帖子,但到目前为止是徒劳的。我哪里错了?
替代方案
使用 SwingWorker。但是,鉴于进程正在执行,我如何知道 SLEEP_TIME?或者更准确地说,我何时以及如何将 SwingWorker 与运行的 process() 方法集成?
SwingWorker<Void, Void> mySwingWorker = new SwingWorker<Void, Void>(){
@Override
protected Void doInBackground() throws Exception {
Thread.sleep(SLEEP_TIME);
return null;
}
};
【问题讨论】:
-
您是否有任何理由将标签从单独的线程添加到框架?为什么不简单地将它添加到框架中(没有线程)?
-
是的,因为不这样做会影响 EDT,并且没有观察到任何变化。 stackoverflow.com/questions/12566311/…
-
那么您需要使用与您的 GUI 线程正确同步的线程。使用
SwingUtilities.invokeLater而不是使用常规的Thread。 -
您的阻塞进程也在您的 GUI 线程上运行,因此您的 GUI 线程将完全阻塞。您需要使用单独的
Thread来阻止进程。 -
对于example
标签: java swing jframe swingworker