为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

倚天杖 2021-08-06 10:42:32
我创建了用于最大化、最小化和退出的自定义按钮。并且一切正常,除了一个例外,程序不记得最小化之前窗口处于哪个状态。所以我的问题是,有没有办法让程序在最小化之前记住窗口状态,并恢复该状态,而不是仅在 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);        }    });
查看完整描述

2 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

您可以采用这种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);

        });

    }

}


查看完整回答
反对 回复 2021-08-06
  • 2 回答
  • 0 关注
  • 157 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信