1

私が達成したいのはそれです

  • 特定の状態では、クラスは他のクラスによって表示されるダイアログを自動的に非表示にする必要があります
  • プログラムの状態が変化すると、非表示のダイアログが表示されます

問題:

  • これはJOptionPanesでは機能しません
  • JOptionPanesは非表示になり、再び表示されますが、自動的に閉じられるため、1秒の一部しか表示されません。

私は次のアプローチを使用しました:

public static void main(String[] args) {


    Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {

        public void eventDispatched(AWTEvent event) {
            WindowEvent windowEvent = ((WindowEvent) event);
            System.out.println(System.currentTimeMillis() + " " + windowEvent);
            switch (windowEvent.getID()) {
            case WindowEvent.WINDOW_OPENED:
                System.out.println("Hiding");
                windowEvent.getComponent().setVisible(false);
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Showing");
                windowEvent.getComponent().setVisible(true);
                break;
            }
        }


    }, AWTEvent.WINDOW_EVENT_MASK + AWTEvent.WINDOW_STATE_EVENT_MASK);

    JOptionPane.showMessageDialog(null,
            "Eggs are not supposed to be green.",
            "Inane custom dialog",
            JOptionPane.INFORMATION_MESSAGE);
}

次の出力が生成されます。

1347602481337 java.awt.event.WindowEvent[WINDOW_ACTIVATED,opposite=null,oldState=0,newState=0] 
on dialog0
1347602481337 java.awt.event.WindowEvent[WINDOW_GAINED_FOCUS,opposite=null,oldState=0,newState=0] on dialog0
1347602481337 java.awt.event.WindowEvent[WINDOW_OPENED,opposite=null,oldState=0,newState=0] on dialog0
Hiding
Showing
1347602486377 java.awt.event.WindowEvent[WINDOW_LOST_FOCUS,opposite=null,oldState=0,newState=0] on dialog0
1347602486377 java.awt.event.WindowEvent[WINDOW_DEACTIVATED,opposite=null,oldState=0,newState=0] on dialog0
1347602486377 java.awt.event.WindowEvent[WINDOW_ACTIVATED,opposite=null,oldState=0,newState=0] on dialog0
1347602486377 java.awt.event.WindowEvent[WINDOW_GAINED_FOCUS,opposite=null,oldState=0,newState=0] on dialog0
1347602486377 java.awt.event.WindowEvent[WINDOW_LOST_FOCUS,opposite=null,oldState=0,newState=0] on dialog0
1347602486377 java.awt.event.WindowEvent[WINDOW_DEACTIVATED,opposite=null,oldState=0,newState=0] on dialog0
1347602486377 java.awt.event.WindowEvent[WINDOW_CLOSED,opposite=null,oldState=0,newState=0] on dialog0
1347602486377 java.awt.event.WindowEvent[WINDOW_CLOSED,opposite=null,oldState=0,newState=0] on dialog0
1347602486377 java.awt.event.WindowEvent[WINDOW_CLOSED,opposite=null,oldState=0,newState=0] on frame0

私の質問は、私が間違ったことをしたのですか?これは設計ごとですか、それともエラーが発生しますか?クラスを間違った方法で使用しますか?はいの場合、正しい方法は何でしょうか?

4

1 に答える 1

3

あなたが間違ったことは、イベントディスパッチスレッドでスリープしていることです。

windowEvent.getComponent().setVisible(false);
try {
  Thread.sleep(5000);
} catch (InterruptedException e) {
  e.printStackTrace();
}
System.out.println("Showing");
windowEvent.getComponent().setVisible(true);

EDTを5秒間ブロックすると、何も再描画できなくなります。Timer代わりに使用してください。

詳細については、Swingチュートリアルの同時実行性を参照してください。

于 2012-09-14T06:12:32.690 に答える