java - 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 像素。
这可以正常工作
- Linux, oracle jdk 1.8.0_201
- Linux,openjdk 1.8.0_252
- Linux,openjdk 11.0.7
- Linux,openjdk 12.0.1
- Windows,oracle jdk 1.8.0.171(旧版本,我知道,但是..示例有效)
这不适用于
- 视窗,openjdk 12.0.1
窗口未最大化打开的位置。
删除呼叫后setPreferredSize
,窗口打开最大化,但在取消最大化时缩小为“无”。
是否有任何已知的错误或解决方法?(移动setPreferredSize
上面setExtendedState
没有帮助)。
解决方案
我遇到了同样的问题,但我设法解决了。
问题是 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();
});
}
}
推荐阅读
- reactjs - nextjs ie11 预期标识符
- angular - Angular 11:并行获取所有页面
- c# - 覆盖 serenity 框架如何处理 [ConnectionKey] 属性
- apache-kafka - 使用 Streaming File Sink 将排序计划数据写入文件
- python - 从 numpy 数组中分割一个区域
- google-apps-script - 用于在显示和隐藏列之间切换的 Google 脚本应用程序
- azure - 天蓝色 cli 脚本中的通配符
- javascript - 如何限制域只接受 24 个字母
- kubernetes - 使用 prometheus-community/kube-prometheus-stack 为 bitnami/redis 启用指标
- image - 如何在 Dart 中将图像或 base64 转换为 Blob