带有JDialog的java小程序在Mac OSX中未正确隐藏
我有一个小程序,可以调用包含JProgressBar组件的JDialog。我将JDialog子类化,以公开更新JProgressBar的方法,类似于:
public class ProgressDialog extends javax.swing.JDialog {
public void setProgress(double progress) {
jProgressBar1.setValue(jProgressBar1.getMinimum() + (int) (progress * jProgressBar1.getMaximum()));
}
...
}
我以以下方式使用此对话框:
public void test() throws Exception {
progressDialog = new ProgressDialog(null, true);
try {
progressDialog.setLocationRelativeTo(null);
// show the dialog
EventQueue.invokeLater(new Runnable() {
public void run() {
progressDialog.setVisible(true);
}
});
// business logic code that calls progressDialog.setProgress along the way
doStuff();
} finally {
progressDialog.setVisible(false);
progressDialog.dispose();
}
}
它在Windows/任何浏览器上都能正常工作。然而,在Mac上的Firefox 2/3/3.5上调用上述函数时,progressDialog会无限期地显示,即它不会关闭
我怀疑在EventQueue内调用setVisible(true)会导致问题,因为这是一个阻塞调用,可能会完全阻塞队列,所以我尝试将其更改为:
// show the dialog
new Thread() {
public void run() {
progressDialog.setVisible(true);
}
}.start();
通过此更改,progressDialog现在可以正确关闭,但出现了一个新问题——对话框的内容(包括progressbar、一个图标和一个用于显示消息字符串的JLabel)不再显示在对话框中。这只是Mac Firefox上的一个问题
有什么想法吗?我意识到这可能是AWT线程问题,但我已经研究了几天,没有找到好的解决方案。将doStuff()业务逻辑包装到一个单独的新线程中似乎是可行的,但将实际的业务逻辑代码重构到一个单独的线程中并不容易,因此我希望有一个更简单的解决方案
环境是: Mac OSX 10.5 Java 1.5 Firefox 2/3/3.5
共 (0) 个答案