当我使用WindowListener时,我可以检测到窗口何时被图标化/去图标化。我的问题:我需要为主机架显示特殊的无头工具窗口。当框架图标化时-我需要隐藏工具窗口(工作正常)。当框架去图标化时,我需要再次显示。最后一件事只能部分起作用:由于动画延迟,工具窗口出现在主框架完全去图标化之前。当然,我可以添加一些超时,但这对我来说很糟糕,因为不同的OS可能会有不同的动画滞后。那么,当窗口完全去图标化后,我应该听哪个事件得到通知?
这是MCVE
import java.awt.Color;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JWindow;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
import javax.swing.border.LineBorder;
/**
* <code>DeiconifyTest</code>.
*/
public class DeiconifyTest {
public static void main(String[] args) {
JFrame frm = new JFrame("Main frame");
frm.add(new JScrollPane(new JTextArea()));
frm.setSize(600, 500);
frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frm.setVisible(true);
JWindow nestedWindow = new JWindow(frm);
JLabel text = new JLabel("Test");
text.setBorder(new LineBorder(Color.BLACK));
text.setHorizontalAlignment(SwingConstants.CENTER);
nestedWindow.add(text);
nestedWindow.setSize(100, 80);
nestedWindow.setLocation(610, 0);
nestedWindow.setVisible(true);
WindowListener wl = new WindowAdapter() {
@Override
public void windowIconified(WindowEvent e) {
nestedWindow.setVisible(false);
}
@Override
public void windowDeiconified(WindowEvent e) {
// nestedWindow is visible before the main frame is deiconified
nestedWindow.setVisible(true);
}
};
frm.addWindowListener(wl);
}
}
答案 0 :(得分:0)
// nestedWindow is visible before the main frame is deiconified
nestedWindow.setVisible(true);
尝试将以上代码包装在SwingUtilities.invokeLater()中,以将逻辑放在EDT的末尾,因此希望首先对主窗口进行去图标化。