簡體   English   中英

Java 8 和 Java 12 之間的區別,JFrame#setExtendedState 不適用於 JFrame#setPreferredSize

[英]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 像素。

這可以正常工作

  • 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(舊版本,我知道,但是..示例有效)

這不適用於

  • Windows,openjdk 12.0.1

其中 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 的所得寬度和高度會自動放大。

您的用例可能是解釋:

  • 您將 window 設置為最大化 state,因此其大小應該是屏幕大小減去桌面邊框的大小。 然而,這是特定於平台的(Windows、Linux 和我不想識別的其他操作系統:))。
  • 您在內容窗格旁邊沒有任何組件,並將首選大小放在 window 而不是其內容窗格上。 JFrame可以委托給內容窗格,但LayoutManager可能會簡單地忽略preferredSize大小(例如, BorderLayout忽略它的CENTER約束),同樣適用於最小值(此處為 0, 0)和最大值(即(Integer.MAX_VALUE, Integer.MAX_VALUE)(Short.MAX_VALUE, Short.MAX_VALUE) )。
  • 您調用 pack,這會影響未最大化的 state 的大小:大小可能無效。

Java 11 和 12 之間可能發生的變化是調整 window 大小的本機調用:它可能只是不允許您將大小更改為 (0,0) 或負值,這可能被認為是ZC89683ZB56A387D5BBC12B的錯誤。 Java 可能會引入另一層(例如:驗證大小)或不引入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM