在 Swing 中,有几种方法可以捕获最小化框架(图标化)的事件,但该事件发生在框架被 ICONIFIED 时,这意味着在框架从屏幕上变得不可见之后。
现在我希望在框架消失之前运行一些代码 -当我单击任务栏按钮时立即运行。
换句话说,当JFrame“即将”(NOT AFTER)被最小化时做一些事情。是否有可能做到这一点?
在 Swing 中,有几种方法可以捕获最小化框架(图标化)的事件,但该事件发生在框架被 ICONIFIED 时,这意味着在框架从屏幕上变得不可见之后。
现在我希望在框架消失之前运行一些代码 -当我单击任务栏按钮时立即运行。
换句话说,当JFrame“即将”(NOT AFTER)被最小化时做一些事情。是否有可能做到这一点?
使用WindowStateListener
, 并调用WindowEvent#getNewState()
检查Frame.ICONIFIED
。
这是一个例子:
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test {
public Test() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
};
frame.add(panel);
frame.addWindowStateListener(new WindowAdapter() {
@Override
public void windowStateChanged(WindowEvent we) {
if (we.getNewState() == Frame.ICONIFIED) {
System.out.println("Here");
}
}
});
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Test();
}
});
}
}
创建您自己的JFrame
并覆盖setExtendedState
方法。
public class MyFrame extends JFrame{
....
setExtendedState(JFrame.ICONIFIED);
....
@Override
public void setExtendedState(int state) {
// your code
super.setExtendedState(state);
};
}
回答“在最小化 JFrame 之前是否可以执行某些操作?”这个问题的答案。
不幸的是,我会说不,我检查了将这些事件发送到 java 空间的框架和窗口的 openjdk (windows) 的本机代码。据我了解,它是来自 windows API VM_SIZE message的回调。并且SIZE_MINIMIZED
在“窗口已最小化”时发送,并且在实际最小化之前没有收到任何消息。