2012-08-15 47 views
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(); 

          } 
         }); 

不幸的是,这并不从其他窗口后面带来正面...任何解决方案?

回答

5

每API文档setExtendedState

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

如果画面在屏幕上不可见,则可能会生成事件,也可能不会生成 。在这种情况下,开发人员可能会假定在此方法返回后立即更改状态 。稍后,当调用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. 
    } 
}); 
3

我发现,对于toFront()上一个JDialog以下解决方法可以在Windows 7(没有测试其他平台还):

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

保罗面包车Bemmelen