[英]Does JFrame.setExtendedState(MAXIMIZED_BOTH) work with undecorated frames?
[英]Difference between Java 8 and Java 12, JFrame#setExtendedState does not work with 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(); });
}
}
預期行為:window 打開最大化。 當用戶單擊最大化按鈕時,window 變為未最大化,大小為 500x300 像素。
這可以正常工作
這不適用於
其中 window 打開未最大化。
當setPreferredSize
調用被移除時,window 打開最大化,但在取消最大化時縮小到“無”。
是否有任何已知的錯誤或解決方法? (將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();
});
}
}
我認為您只是誤解了pack的效果:
導致此 Window 的大小調整為適合其子組件的首選大小和布局。 如果任一尺寸小於先前調用 setMinimumSize 方法指定的最小尺寸,則 window 的所得寬度和高度會自動放大。
您的用例可能是解釋:
JFrame
可以委托給內容窗格,但LayoutManager
可能會簡單地忽略preferredSize
大小(例如, BorderLayout
忽略它的CENTER
約束),同樣適用於最小值(此處為 0, 0)和最大值(即(Integer.MAX_VALUE, Integer.MAX_VALUE)
或(Short.MAX_VALUE, Short.MAX_VALUE)
)。Java 11 和 12 之間可能發生的變化是調整 window 大小的本機調用:它可能只是不允許您將大小更改為 (0,0) 或負值,這可能被認為是ZC89683ZB56A387D5BBC12B的錯誤。 Java 可能會引入另一層(例如:驗證大小)或不引入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.