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

标签 java swing windowbuilder

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

我的解决方案:

最大化:

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

最佳答案

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

关于java - 自定义最大化、最小化按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51967508/

相关文章:

java - SWT- 如何在 Windows 中更改 ProgressBar 颜色?

Java eclipse WindowBuilder,改变外观

java - 如何在遍历所有按钮时解决陈旧元素?

java - 如何控制DateFormat返回的月日名称大小写?

java - 如何在android客户端和自定义java服务器之间使用SSL套接字

java - 使用 Spring Kafka 框架时如何处理错误/异常?

java - 在操作事件方法中,它找不到我的 Jbutton 对象。我正在尝试制作角色选择类型的东西,但找不到可行的解决方案

swing - 与 Swing 相关的 Scala NoClassDefFoundError

java - 简单计算器 - 文本字段问题

java - 当我更改 SWT 中按钮的文本时,整个按钮的大小会发生变化。我怎样才能禁用这个功能?