簡體   English   中英

Swing:如何禁止在JFrame / JDialog之外進行交互?

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

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