简体   繁体   中英

Is it possible to perform some action BEFORE a JFrame is minimized?

In Swing, there are several ways to capture the event of minimizing a frame (iconifying), but the event happens when the frame is ICONIFIED which means after the frame becomes invisible from the screen.

Now I wish to run some code before disappearance of the frame -- immediately when I click the taskbar button .

In other words, do something when the JFrame is "about to" (NOT AFTER) be minimized . Is it possible to do this?

Use WindowStateListener , and call WindowEvent#getNewState() and check against Frame.ICONIFIED .

Here is an example:

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();
            }
        });
    }
}

Create your own JFrame and override setExtendedState method.

public class MyFrame extends JFrame{

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


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

    super.setExtendedState(state);
   };

 }

Answer to the question "Is it possible to perform some action BEFORE a JFrame is minimized?"

I would say no unfortunately, I checked the native code for openjdk (windows) for frame and window that sends these events to java-space. And as I understand it, it is a callback from the windows API VM_SIZE message . And the SIZE_MINIMIZED is sent when "The window has been minimized" and is not getting any messages before the actual minimization.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM