Java - 无法将窗口带到前面

时间:2012-08-15 13:54:38

标签: java swing

我正在尝试执行以下代码:

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();

                            }
                        });

不幸的是,这并没有从其他窗口后面把它带到前面......任何解决方案?

2 个答案:

答案 0 :(得分:5)

根据setExtendedState的API文档:

  

如果框架当前在屏幕上可见(   Window.isShowing()方法返回true),开发人员应该检查   的WindowEvent.getNewState()方法的返回值   WindowEvent通过WindowStateListener接收来确定   国家实际上已经改变了

     

如果屏幕上看不到框架,则事件可能会也可能不会   生成。在这种情况下,开发者可以假设该状态   此方法返回后立即更改。后来的时候   调用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.
  }
});

答案 1 :(得分:3)

我发现JDialog上的toFront()的以下解决方法适用于Windows 7(尚未测试其他平台):

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

Paul van Bemmelen