在Swing中,有几种方法可以捕获最小化框架(图标化)的事件,但事件发生在框架为ICONIFIED时,意味着框架在屏幕上不可见之后。在JFrame最小化之前可以执行某些操作吗?
现在我想之前消失帧的运行一些代码- 立即当我点击任务栏按钮。
换句话说,做一些事情时,JFrame的是“即将”(不是之后)最小化。是否有可能做到这一点?
在Swing中,有几种方法可以捕获最小化框架(图标化)的事件,但事件发生在框架为ICONIFIED时,意味着框架在屏幕上不可见之后。在JFrame最小化之前可以执行某些操作吗?
现在我想之前消失帧的运行一些代码- 立即当我点击任务栏按钮。
换句话说,做一些事情时,JFrame的是“即将”(不是之后)最小化。是否有可能做到这一点?
使用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();
}
});
}
}
已在Mac OS X上验证过。 – trashgod
它在Windows上也可以正常工作,但在窗口最小化后仍会捕获该事件。我会说对不起,我的问题可能不是那么容易理解,但是我试图强调的是,当窗口“即将被最小化”时,我能够抓住一些东西吗? – shuangwhywhy
即使改变super.windowStateChanged(我们)和我的代码的位置,当窗口已经“ICONIFIED”时它仍然被捕获,我想要的是“ICONIFYING” - 就像“WINDOW_CLOSING”一样。 – shuangwhywhy
创建您自己的JFrame
并覆盖setExtendedState
方法。
public class MyFrame extends JFrame{
....
setExtendedState(JFrame.ICONIFIED);
....
@Override
public void setExtendedState(int state) {
// your code
super.setExtendedState(state);
};
}
感谢Maxim,我已经重写了这个方法以及setState(),但是当我点击任务栏按钮时,框架就消失了,没有任何反应。 – shuangwhywhy
@David,谢谢,但我怕框架被系统图标化时调用setState()和setExtendedState()吗? - 这是问题,实际上,我没有装饰JFrame,并附加了我自己调用setState()的自定义最小化按钮,并且它以这种方式正常工作,但如果单击任务栏中的最小化按钮,它就是另一个故事。 – shuangwhywhy
问题的回答“是否有可能之前JFrame的最小化,以执行一些动作?”
我会说不,不幸的是,我检查了openjdk(windows)的本地代码frame和window,它们将这些事件发送到java空间。据我所知,它是从Windows API VM_SIZE message回调。当“窗口已经最小化”并且在实际最小化之前没有得到任何消息时,发送SIZE_MINIMIZED
。
我(很)晚,但如果没有其他工作,这是很重要的,我会去自定义最小化/最大化/ /等未修饰的框架。纽扣。 顺便说一句,你是否尝试重写外观和感觉(我想它负责绘制这些按钮)并在那里使用自己的处理? – Matthieu
我现在正在研究未修饰的框架解决方案,因为它似乎是唯一可行的路线,但是外观和感觉理念是我将在本周末探索的一条有趣路线。如果你可以把一个或多个样本放在一个可用的答案中,我可以给你赏金。 – glenneroo