猿问

自定义最大化、最小化按钮

我创建了用于最大化、最小化和退出的自定义按钮。并且一切正常,除了一个例外,程序不记得最小化之前窗口处于哪个状态。所以我的问题是,有没有办法让程序在最小化之前记住窗口状态,并恢复该状态,而不是仅在 NORMAL 状态下返回?


我的解决方案:


最大化:


JButton btnO = new JButton("O");

    btnO.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent arg0) {

            if (frame.getExtendedState() == JFrame.MAXIMIZED_BOTH) {

                frame.setExtendedState(JFrame.NORMAL);

            } else {

                frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

            }

        }

    });

并最小化:


JButton btnMinimize = new JButton("-");

    btnMinimize.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {

            frame.setExtendedState(JFrame.ICONIFIED);

        }

    });


倚天杖
浏览 158回答 2
2回答

扬帆大鱼

您可以采用这种ComponentListener方法并在组件(在您的情况下,框架)调整大小时恢复其状态。代码中的一些额外注释。看看这个例子:import java.awt.Dimension;import java.awt.FlowLayout;import java.awt.event.ComponentEvent;import java.awt.event.ComponentListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.SwingUtilities;public class FrameState extends JFrame {    private static final long serialVersionUID = 1965751967944243251L;    private int state = -1; // Variable to keep the last state.    public FrameState() {        super("Nothing :)");        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        JButton b = new JButton("-");        b.addActionListener(e -> {            state = getExtendedState(); //Store the state before "-" is pressed            setExtendedState(JFrame.ICONIFIED);        });        JButton o = new JButton("O");        o.addActionListener(e -> {            if (getExtendedState() == JFrame.MAXIMIZED_BOTH) {                setExtendedState(JFrame.NORMAL);            } else {                setExtendedState(JFrame.MAXIMIZED_BOTH);            }        });        getContentPane().setLayout(new FlowLayout());        getContentPane().add(o);        getContentPane().add(b);        setSize(new Dimension(300, 300));        setLocationRelativeTo(null);        addComponentListener(new ComponentListener() {            @Override            public void componentShown(ComponentEvent arg0) {            }            @Override            public void componentResized(ComponentEvent arg0) {                if (state != -1) {                    setExtendedState(state); //Restore the state.                    state = -1; //If it is not back to -1, window won't be resized properly by OS.                }            }            @Override            public void componentMoved(ComponentEvent arg0) {            }            @Override            public void componentHidden(ComponentEvent arg0) {            }        });    }    public static void main(String[] args) {        SwingUtilities.invokeLater(() -> {            FrameState f = new FrameState();            f.setVisible(true);        });    }}
随时随地看视频慕课网APP

相关分类

Java
我要回答