根据 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.
}
});