[英]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.