[英]Swing: How to prohibit interaction outside of JFrame/JDialog?
我想顯示一個進度條,並在執行線程時阻止與應用程序框架的交互。
在另一個線程中,有人建議使用JDialog而不是JFrame和setModal(true)
。 但是,這樣做時,對話框將阻止整個應用程序。
這基本上是我的代碼:
MyDialog dlg = new MyDialog();
dlg.setModal(true);
dlg.setVisible(true);
//do some stuff....
//(never executed when setModal(true)
dlg.setVisible(false);
最簡單的方法是使用JXLayer和LockableUI。 在這里查看如何完成此操作的示例。
還要注意,JXLayer使其成為Java 7,可以通過javax.swing.JLayer獲得 。
另一件事是,您不應在現場事件調度線程中執行長時間運行的任務。 閱讀有關SwingWorker的知識,並學習為Swing編寫多線程代碼 。
這就是模式對話框的關鍵,在“框”之外不會發生任何交互。 模態彈出窗口還會在等待用戶輸入時暫停線程。 如果要在顯示對話框時執行其他操作,則必須在對話框本身中執行此操作,或者啟動一個新線程來處理它。
希望有幫助!
使用模式對話框嘗試如下操作:
final JDialog dlg = new JDialog();
dlg.setModal(true);
dlg.setSize(500, 500);
dlg.addWindowListener(new WindowAdapter() {
@Override
public void windowActivated(WindowEvent e) { //or other method
new Thread(new Runnable() {
public void run() {
try {
//execute your long running task
} //you should catch exception
finally {
dlg.setVisible(false);
dlg.dispose();
}
}
}).start();
}
});
dlg.setVisible(true);
我還可以在JFrame上設置GlassPane,它將攔截來自用戶的任何事件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.