有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有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) 个答案