簡體   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