簡體   English   中英

從線程關閉JDialog框

[英]Closing JDialog box from a thread

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

請幫助我。

這不能按預期工作的原因是對於模式對話框,方法setVisible()將阻塞調用線程,直到關閉對話框。 這意味着調用線程將在pd.s_show()pd.s_show() ,並且在用戶關閉對話框之前不會繼續到下一行( Thread.sleep(1000) )。

解決此問題的最簡單方法是刪除對setModal(true)的調用。 但是,您將失去模態行為。

PS如radai所述,從事件分發線程以外的其他線程調用Swing代碼不是線程安全的。 從這種意義上講,您的代碼也被破壞了。

僅應從swing事件調度程序線程調用swing操作。 嘗試使用SwingUtilities.invokeAndWait()從非GUI線程執行GUI工作。 您可以在此處看到一些示例: http : //book.javanb.com/java-threads-3rd/jthreads3-CHP-7-SECT-3.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM