我有一个方法 register() 需要很长时间才能完成。所以我把它放在 swingworker 的 doInBackGround() 中。与此同时,我想显示模态对话框,并且上面有不确定的进度条。
private void registerPopupItemActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
WaitDialog dialog = new WaitDialog(new javax.swing.JFrame(), true);
dialog.addWindowListener(new java.awt.event.WindowAdapter() {
});
dialog.setVisible(true);
SwingWorker worker = new SwingWorker() {
@Override
protected Object doInBackground() throws Exception {
register();
return 0;
}
};
dialog.dispose();
}
但是一切都卡住了。在调试器中我看到 regester() 没有被调用。我哪里搞砸了?任何帮助将不胜感激!谢谢!
最佳答案
在模态对话框上调用setVisible(true)后调用dialog.dispose,因此可能永远不会调用dispose。相反,在 SwingWorker 中的完成重写中调用 dispose,并在调用对话框上的 setVisible(true) 之前在 SwingWorker 上调用执行。
类似这样的东西(警告,代码未测试):
private void registerPopupItemActionPerformed(java.awt.event.ActionEvent evt) {
WaitDialog dialog = new WaitDialog(new javax.swing.JFrame(), true);
dialog.addWindowListener(new java.awt.event.WindowAdapter() {
});
SwingWorker worker = new SwingWorker() {
@Override
protected Object doInBackground() throws Exception {
register();
return 0;
}
@Override
protected void done() {
dialog.dispose();
}
};
worker.execute();
dialog.setVisible(true);
}
关于java - SwingWorker 中的进度对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8121621/