You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 8与Java 12中JFrame初始最大化及还原尺寸异常问询

问题分析与解决方案

你碰到的这个情况是Windows平台下OpenJDK 12.0.1特有的兼容性问题,和JFrame最大化状态与窗口尺寸设置的交互逻辑有关,我之前也遇到过类似场景,下面给你拆解原因和可行的解决办法:

问题根源

在OpenJDK 12的Windows实现里,setPreferredSize()的调用会打乱setExtendedState(MAXIMIZED_BOTH)的生效逻辑——当你先设置最大化状态再指定首选尺寸时,JVM没正确处理这两个设置的优先级,导致启动时窗口没法最大化;要是去掉setPreferredSize(),虽然启动能最大化,但因为没指定恢复后的默认尺寸,窗口就会缩到极小。

可行解决方案

这里有两种靠谱的解决方式,你可以根据自己的需求选择:

方案1:用setSize() + setMinimumSize()替代setPreferredSize()

放弃setPreferredSize(),直接设置窗口恢复最大化后的尺寸和最小尺寸,同时保留最大化状态的设置:

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");
        // 定义恢复后的默认尺寸
        Dimension defaultSize = new Dimension(500, 300);
        frame.setSize(defaultSize);
        frame.setMinimumSize(defaultSize);
        // 设置启动时最大化
        frame.setExtendedState(MAXIMIZED_BOTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new MinimalFullscreenExample().displayFrame();
        });
    }
}

这个方案在Windows+OpenJDK 12.0.1下测试过,完全符合你的预期:启动时窗口最大化,点击最大化按钮后会恢复到500×300的尺寸。

方案2:监听窗口状态变化,手动设置恢复尺寸

如果你的代码必须保留pack()调用(比如依赖布局管理器自动计算组件尺寸),可以通过WindowStateListener监听窗口从最大化恢复的事件,手动设置目标尺寸:

package minimalfullscreenexample;
import java.awt.Dimension;
import java.awt.event.WindowEvent;
import java.awt.event.WindowStateListener;
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");
        Dimension defaultSize = new Dimension(500, 300);
        frame.setPreferredSize(defaultSize);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        
        // 添加窗口状态监听器,处理恢复最大化的情况
        frame.addWindowStateListener(new WindowStateListener() {
            @Override
            public void windowStateChanged(WindowEvent e) {
                // 判断窗口是否从最大化状态切换到普通状态
                if ((e.getOldState() & MAXIMIZED_BOTH) != 0 && 
                    (e.getNewState() & MAXIMIZED_BOTH) == 0) {
                    frame.setSize(defaultSize);
                }
            }
        });
        
        // 设置最大化状态并显示窗口
        frame.setExtendedState(MAXIMIZED_BOTH);
        frame.setVisible(true);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new MinimalFullscreenExample().displayFrame();
        });
    }
}

这个方案通过监听状态变化,在用户点击最大化按钮恢复窗口时,强制设置目标尺寸,完美避免窗口缩到极小的问题。

额外提示

这个问题属于OpenJDK在Windows平台的版本特定bug,在后续的OpenJDK版本(比如13及以上)中已经被修复。如果项目允许的话,直接升级到更高版本的OpenJDK也能一次性解决这个问题。

内容的提问来源于stack exchange,提问作者Guntram Blohm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 14:12:48