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回调可以挂接到 on 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 回答