繁体   English   中英

Java未最大化JFrame

[英]Java un-maximize 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);

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

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

设置该框架的状态。 该状态表示为按位掩码。
-正常
指示未设置任何状态位。
-已确认
-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);

问题“似乎”在于disposesetUndecorated或两者结合。 发生的“似乎”是当您将框架恢复到正常状态时,它保持了最大化时的大小和位置。

因此,我要做的是在最大化之前获取窗口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);

    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM