首页 > 解决方案 > Java 8 和 Java 12 之间的区别,JFrame#setExtendedState 不适用于 JFrame#setPreferredSize

问题描述

我想创建一个最初最大化的 JFrame,并具有定义的大小,当用户按下最大化按钮时它会缩小。

最小的例子:

package minimalfullscreenexample;

import java.awt.Dimension;
import static java.awt.Frame.MAXIMIZED_BOTH;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class MinimalFullscreenExample {

    public void displayFrame() {
        JFrame frame = new JFrame("Minimal example");
        frame.setExtendedState(MAXIMIZED_BOTH);
        frame.setPreferredSize(new Dimension(500, 300));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(()  -> { new MinimalFullscreenExample().displayFrame(); });
    }
}

预期行为:窗口最大化打开。当用户单击最大化按钮时,窗口变为未最大化,大小为 500x300 像素。

这可以正常工作

这不适用于

窗口未最大化打开的位置。

删除呼叫后setPreferredSize,窗口打开最大化,但在取消最大化时缩小为“无”。

是否有任何已知的错误或解决方法?(移动setPreferredSize上面setExtendedState没有帮助)。

标签: javaswingjframefullscreen

解决方案


我遇到了同样的问题,但我设法解决了。
问题是 frame.pack()。
事实上,它将框架的大小设置为其首选大小。我还注意到 Java 8(或 9)和 Java 12 之间的区别,我认为这是 openjdk 上的一个错误。

但是,要解决此问题,您应该在调用 pack()之后调用 setExtendedState,如下所示:

package minimalfullscreenexample;

import static java.awt.Frame.MAXIMIZED_BOTH;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class MinimalFullscreenExample {

    public void displayFrame() {
        JFrame frame = new JFrame("Minimal example");
        frame.setPreferredSize(new Dimension(500, 300));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setExtendedState(MAXIMIZED_BOTH); // after frame.pack()
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new MinimalFullscreenExample().displayFrame();
        });
    }
}


推荐阅读