我正在尝试执行以下代码:
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();
}
});
不幸的是,这并没有从其他窗口后面把它带到前面......任何解决方案?
答案 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