4

在 Swing 中,有几种方法可以捕获最小化框架(图标化)的事件,但该事件发生在框架被 ICONIFIED 时,这意味着在框架从屏幕上变得不可见之后。

现在我希望在框架消失之前运行一些代码 -当我单击任务栏按钮时立即运行。

换句话说,当JFrame“即将”(NOT AFTER)被最小化时做一些事情。是否有可能做到这一点?

4

3 回答 3

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();
            }
        });
    }
}
于 2012-12-09T23:57:19.517 回答
0

创建您自己的JFrame并覆盖setExtendedState方法。

public class MyFrame extends JFrame{

   ....
    setExtendedState(JFrame.ICONIFIED); 
   ....


@Override
public void setExtendedState(int state) {       
    // your code

    super.setExtendedState(state);
   };

 }
于 2012-12-09T22:47:20.310 回答
0

回答“在最小化 JFrame 之前是否可以执行某些操作?”这个问题的答案。

不幸的是,我会说不,我检查了将这些事件发送到 java 空间的框架窗口的 openjdk (windows) 的本机代码。据我了解,它是来自 windows API VM_SIZE message的回调。并且SIZE_MINIMIZED在“窗口已最小化”时发送,并且在实际最小化之前没有收到任何消息。

于 2016-04-14T19:45:42.877 回答