在Swing中,有几种方法可以捕捉最小化帧的图像(图标化),但是当帧是ICONIFIED时会发生事件,这意味着帧在屏幕上不可见之后。
现在我希望在消失之前运行一些代码 - 当我点击任务栏按钮时立即。
换句话说,在JFrame“即将”(非AFTER)最小化时执行某些操作。有可能这样做吗?
答案 0 :(得分:3)
使用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();
}
});
}
}
答案 1 :(得分:0)
创建您自己的JFrame
并覆盖setExtendedState
方法。
public class MyFrame extends JFrame{
....
setExtendedState(JFrame.ICONIFIED);
....
@Override
public void setExtendedState(int state) {
// your code
super.setExtendedState(state);
};
}
答案 2 :(得分:0)
回答问题"是否可以在最小化JFrame之前执行某些操作?"
我不会遗憾地说,我检查了frame和window的openjdk(windows)的本机代码,它们将这些事件发送到java-space。据我了解,它是来自Windows API VM_SIZE message的回调。当"窗口已经最小化时发送request.getParameter
"并且在实际最小化之前没有收到任何消息。