Java un-maximize JFrame

Java un-maximize JFrame

我有一个简单的问题,我没有找到答案二,可能是因为我不知道如何给它起标题。假设我有一个宽度为 X 和高度为 Y 的 JFrame。在我的程序中的某个地方,我必须最大化它以适应整个屏幕,并执行 myJFrame.setExtendedState(JFrame.MAXIMIZED_BOTH); 来完成它。现在,稍后我必须将 JFrame "un-maximize" 和 return 设为其原始大小。可能有一个简单的命令,但我还没有找到。我想到了一个类似于 myJFrame.setExtendedState(JFrame.MAXIMIZED_NONE); 的命令 简而言之:最大化 JFrame 后,我该如何 "un-maximize" 呢?

编辑: 看来问题不是我找不到我需要的方法,而是我的一些代码阻止了 myJFrame.setExtendedState(JFrame.NORMAL);正常工作。这是这个错误代码:

        frame.dispose();
        if (b) {
            frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
            frame.setUndecorated(true);
        } else {
            frame.setExtendedState(JFrame.NORMAL);
            frame.setUndecorated(false);
        }
        frame.setVisible(true);

重新排列上面代码中的语句解决了问题:)

如果您查看 Frame#setExtendedState 的 JavaDocs,您将看到一个可能值列表

Sets the state of this frame. The state is represented as a bitwise mask.
- NORMAL
Indicates that no state bits are set.
- ICONIFIED
- MAXIMIZED_HORIZ
- MAXIMIZED_VERT
- MAXIMIZED_BOTH
Concatenates MAXIMIZED_HORIZ and MAXIMIZED_VERT.

那么如果我们看一下 Frame#NORMAL

Frame is in the "normal" state. This symbolic constant names a frame state with all state bits cleared

这看起来很有希望

import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {

            JButton unmax = new JButton("Switch");
            unmax.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    JFrame frame = (JFrame) SwingUtilities.windowForComponent(TestPane.this);
                    if (frame.getExtendedState() != JFrame.NORMAL) {
                        frame.setExtendedState(JFrame.NORMAL);
                    } else {
                        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
                    }
                }
            });
            setLayout(new GridBagLayout());
            add(unmax);

        }

    }

}

所以,所有这一切都是检查当前 windows extendedState,如果它没有设置为 NORMAL,则将其设置为 NORMAL,否则设置MAXIMIZED_BOTH

根据示例代码更新...

好的,基于您的示例代码...

frame.dispose();
if (b) {
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    frame.setUndecorated(true);
} else {
    frame.setExtendedState(JFrame.NORMAL);
    frame.setUndecorated(false);
}
frame.setVisible(true);

问题 "seems" 在于 disposesetUndecorated 或两者的组合。 "seems" 发生的事情是,当您将框架恢复到正常状态时,它会保持最大化时的大小和位置。

所以,我所做的是在 windows bounds 最大化之前抓取一份副本,当它恢复时,我重新应用它

public class TestPane extends JPanel {

    private Rectangle previousBounds;

    public TestPane() {

        JButton unmax = new JButton("Switch");
        unmax.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JFrame frame = (JFrame) SwingUtilities.windowForComponent(TestPane.this);
                frame.dispose();
                if (frame.getExtendedState() != JFrame.NORMAL) {
                    frame.setExtendedState(JFrame.NORMAL);
                    frame.setUndecorated(false);
                    frame.setBounds(previousBounds);
                } else {
                    previousBounds = frame.getBounds();
                    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
                    frame.setUndecorated(true);
                }
                frame.setVisible(true);
            }
        });
        setLayout(new GridBagLayout());
        add(unmax);

    }

}