2

次のコードを実行しようとしています。

SwingUtilities.invokeLater(new Runnable() {
                            public void run() {
                                if (frame.getExtendedState() == Frame.ICONIFIED)
                                    frame.setExtendedState(Frame.NORMAL);
                                frame.getGlassPane().setVisible(!frame.getGlassPane().isVisible());

                                frame.toFront();
                                frame.repaint();

                            }
                        });

残念ながら、これは他のウィンドウの後ろから前面に移動しません...解決策はありますか?

4

2 に答える 2

5

のAPIドキュメントによるとsetExtendedState

フレームが現在画面に表示されている場合(Window.isShowing()メソッドはtrueを返します)、開発者はWindowStateListenerを介して受信したWindowEventのWindowEvent.getNewState()メソッドの戻り値を調べて、状態が実際にあるかどうかを判断する必要があります。変更されました。

フレームが画面に表示されていない場合、イベントが生成される場合と生成されない場合があります。この場合、開発者は、このメソッドが戻った直後に状態が変化すると想定する場合があります。後で、setVisible(true)メソッドが呼び出されると、フレームはこの状態を適用しようとします。この場合も、WindowEvent.WINDOW_STATE_CHANGEDイベントの受信は保証されません。

windowDeiconifiedただし、フックできるコールバックもありWindowListenerます。

SwingUtilities.invokeLater(new Runnable() {
  private final WindowListener l = new WindowAdapter() {
    @Override
    public void void windowDeiconified(WindowEvent e) {
      // Window now deiconified so bring it to the front.
      bringToFront();

      // Remove "one-shot" WindowListener to prevent memory leak.
      frame.removeWindowListener(this);
    }
  };

  public void run() {
    if (frame.getExtendedState() == Frame.ICONIFIED) {
      // Add listener and await callback once window has been deiconified.
      frame.addWindowListener(l);
      frame.setExtendedState(Frame.NORMAL);
    } else {
      // Bring to front synchronously.
      bringToFront();
    }
  }

  private void bringToFront() {
    frame.getGlassPane().setVisible(!frame.getGlassPane().isVisible());
    frame.toFront();
    // Note: Calling repaint explicitly should not be necessary.
  }
});
于 2012-08-15T14:18:55.923 に答える
3

JDialog での toFront() の次の回避策が Windows 7 で機能することがわかりました (他のプラットフォームはまだテストしていません)。

boolean aot = dialog.isAlwaysOnTop();
dialog.setAlwaysOnTop(true);
dialog.setAlwaysOnTop(aot);

パウル・ヴァン・ベンメレン

于 2013-08-02T10:49:26.120 に答える