0

我有一个 JDialg 用于显示某个任务的进度。要显示和隐藏对话框,我有以下方法,

public class ProgressDisplayer extends javax.swing.JDialog {
    ......
    public void s_show() {
            this.setTitle("Month End Status");
            setModal(true);
            setResizable(false);
            pack();
            this.setLocationRelativeTo(null);
            this.setVisible(true);
        }

        public void s_hide() {
            this.dispose();
        }

    ...........
}

当我尝试从下面的线程中关闭此 JDialog 框时,虽然它显示正确但我在调用pd.s_hide()方法时无法隐藏它。

...........
public void run() {            
                ProgressDisplayer pd = new ProgressDisplayer();
                pd.s_show();                    
                Thread.sleep(1000);
                pd.s_hide();
}
.............

请帮助我。

4

2 回答 2

5

这不能按预期工作的原因是,对于模式对话框,该方法setVisible()将阻塞调用线程,直到对话框关闭。这意味着调用线程将阻塞,并且在用户关闭对话框之前pd.s_show()不会继续到下一行( )。Thread.sleep(1000)

解决此问题的最简单方法是删除对setModal(true). 但是,您将失去模态行为。

PS 正如 radai 提到的,从事件调度线程以外的线程调用 Swing 代码不是线程安全的。从这个意义上说,您的代码也被破坏了。

于 2012-09-07T04:29:25.353 回答
2

摆动操作应始终仅从摆动事件调度程序线程调用。尝试使用 SwingUtilities.invokeAndWait() 从非 gui 线程执行您的 gui 工作。你可以在这里看到一些例子:http: //book.javanb.com/java-threads-3rd/jthreads3-CHP-7-SECT-3.html

于 2012-09-07T04:24:22.753 回答