是否可以在JFrame最小化之前执行某些操作?

时间:2012-12-09 22:42:08

标签: java swing user-interface jframe frame

在Swing中,有几种方法可以捕捉最小化帧的图像(图标化),但是当帧是ICONIFIED时会发生事件,这意味着帧在屏幕上不可见之后。

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

换句话说,在JFrame“即将”(非AFTER)最小化时执行某些操作。有可能这样做吗?

3 个答案:

答案 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之前执行某些操作?"

我不会遗憾地说,我检查了framewindow的openjdk(windows)的本机代码,它们将这些事件发送到java-space。据我了解,它是来自Windows API VM_SIZE message的回调。当"窗口已经最小化时发送request.getParameter"并且在实际最小化之前没有收到任何消息。