2

プログレスバーを表示し、スレッドの実行中にアプリケーション フレームとのやり取りをブロックしたいと考えています。

別のスレッドで、誰かが JFrame の代わりに JDialog を使用することを提案しsetModal(true)ました。ただし、そうすると、ダイアログはアプリケーション全体をブロックします。

これは本質的に私のコードです:

 MyDialog dlg = new MyDialog(); 
 dlg.setModal(true); 
 dlg.setVisible(true); 

 //do some stuff....
 //(never executed when setModal(true)

 dlg.setVisible(false); 
4

3 に答える 3

3

これを行う最も簡単な方法は、JXLayer と LockableUI を使用することです。これを行う方法の例については、こちらをご覧ください。

また、JXLayer は Java 7 になり、javax.swing.JLayerとして利用できることにも注意してください。

もう 1 つは、長時間実行されるタスクをイベント ディスパッチ スレッド内で実行しないことです。SwingWorkerについて読み、 Swing のマルチスレッド コードの書き方を学びます。

于 2012-06-01T14:07:47.460 に答える
3

これがモーダル ダイアログのポイントであり、「ボックス」の外では対話は発生しません。モーダル ポップアップは、ユーザー入力を待機している間もスレッドを停止します。ダイアログを表示している間に他のことをしたい場合は、ダイアログ自体でそれを行うか、新しいスレッドを開始してそれを処理する必要があります。

それが役立つことを願っています!

于 2012-06-01T14:07:54.467 に答える
1

モーダルダイアログでは、次のようなことを試してください:

                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 を設定することもできます。

于 2012-06-01T20:58:24.503 に答える