Java取消最大化JFrame

时间:2015-06-25 04:31:40

标签: java swing jframe

我有一个简单的问题,我没有找到答案二,可能是因为我不知道如何标题。假设我有一个宽度为X且高度为Y的JFrame。在我的程序中,我必须最大化它以适应整个屏幕,然后执行myJFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);来实现它。现在,稍后我必须使JFrame“取消最大化”并返回其原始大小。可能有一个简单的命令,但我没有找到任何。我想到的命令类似myJFrame.setExtendedState(JFrame.MAXIMIZED_NONE);之类的命令 简而言之:在最大化JFrame之后,我如何“取消最大化”呢?

编辑:似乎问题不在于我无法找到我所使用的方法,而是我的部分代码阻止了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);

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

1 个答案:

答案 0 :(得分:2)

如果你看一下Frame#setExtendedState的JavaDocs,你会看到一个可能的值列表

  

设置此帧的状态。国家被表示为按位   面具。
    - NORMAL
表示未设置状态位     - ICONIFIED
    - MAXIMIZED_HORIZ
    - MAXIMIZED_VERT
    - MAXIMIZED_BOTH
连接MAXIMIZED_HORIZ和MAXIMIZED_VERT。

然后,如果我们看看Frame#NORMAL

  

框架在"正常"州。此符号常量命名一个帧状态,所有状态位清零

这似乎很有希望

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

        }

    }

}

所有这一切都是检查当前窗口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);

根据示例代码更新...

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

dispose

问题"似乎"与setUndecoratedbounds或两者兼而有之。什么"似乎"发生的事情是当你将帧恢复到正常状态时,它会保持最大化时的大小和位置。

所以,我做了什么,在最大化之前获取了一个窗口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); } } 的副本,当它被恢复时,我重新应用了它

public static Number reduceNum1(List<Number> nums) {
  return nums.stream().reduce(0, (a, b) -> a);
}