问题 当一个按钮被点击时,它需要弹出一个正在加载的 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;
}
};
最佳答案
这...
Thread t = new Thread(new Runnable() {
@Override
public void run() {
ProcessFrame.this.frame.add(loaderLabel);
}
});
是个坏主意,因为您违反了 Swing 的单线程规则(并且您永远不会启动 Thread
)
它应该更像是……
ProcessFrame.this.frame.add(loaderLabel);
ProcessFrame.this.frame.revalidate();
ProcessFrame.this.frame.repaint();
然后你应该运行 process();//
,使用它的 SwingWorker
中的长进程PropertyChangeSupport
来确定工作人员何时完成,作为 example
关于java - 当一个长进程正在运行时,如何在我的 JFrame 中加载动画 GIF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34719923/