0

特定のタスクの進行状況を表示するための 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();
}
.............

私を助けてください。

4

2 に答える 2

5

これが期待どおりに機能しない理由は、モーダル ダイアログの場合setVisible()、ダイアログが閉じられるまでメソッドが呼び出し元のスレッドをブロックするためです。これは、呼び出し元のスレッドが でブロックされ、ユーザーがダイアログを閉じるまでpd.s_show()次の行 ( ) に進まないことを意味します。Thread.sleep(1000)

これを修正する最も簡単な方法は、への呼び出しを削除することsetModal(true)です。ただし、モーダル動作は失われます。

PS radaiが言及しているように、イベントディスパッチスレッド以外のスレッドからSwingコードを呼び出すことはスレッドセーフではありません。あなたのコードもこの意味で壊れています。

于 2012-09-07T04:29:25.353 に答える
2

swing 操作は常に、swing イベント ディスパッチャ スレッドからのみ呼び出す必要があります。SwingUtilities.invokeAndWait() を使用して、非 GUI スレッドから GUI 作業を実行してみてください。ここでいくつかの例を見ることができます: http://book.javanb.com/java-threads-3rd/jthreads3-CHP-7-SECT-3.html

于 2012-09-07T04:24:22.753 に答える