【问题标题】:Closing JDialog box from a thread从线程中关闭 JDialog 框
【发布时间】:2012-09-07 04:06:57
【问题描述】:

我有一个 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();
}
.............

请帮助我。

【问题讨论】:

  • “当 .. from a Thread .. is not hidden.” 您是否确认当从线程调用 not 时它会正确隐藏?似乎setVisible(false); 不会误入歧途。

标签: java swing concurrency jdialog event-dispatching


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多