簡體   English   中英

Insets.top,left,bottom,right全部為零

[英]Insets.top , left, bottom, right all zero

這是我用來實例化JFrame的代碼示例:

public class TestFrame{
public static void main(String[] args){
    JFrame frame = new JFrame();
    Insets insets = frame.getInsets();
    frame.setSize(new Dimension(insets.right + insets.left + 400, insets.bottom + insets.top + 400));
    System.out.println(String.format("Top = %d \nBottom = %d \nLeft = %d \n Right
            = %d", insets.top, insets.bottom, insets.left, insets.right));

    frame.setResizable(false);
    frame.setVisible(true);
}
}

框架顯示正常,但所有插圖似乎都等於零。 我需要知道頂部標題欄的大小,因為我想要一個大小為400x400的內容窗格。

我在多個平台上測試過它,在Windows和Mac上也會發生同樣的事情。

我究竟做錯了什么 ?

  1. 如果您希望內容窗格精確地為400x400,那么我會考慮將其preferredSize設置為400x400(雖然我不想強制首選大小,但在內容窗格中,在某些情況下可能是可接受的)。
  2. 設置首選大小后,在顯示框架之前,請在框架上調用pack()

這是最干凈,最簡單的解決方案,您不必關心邊界插入。

如果contentPane恰好是400 x 400,那么創建一個類,為其preferredSize返回該值並將其用作contentPane:

class MyContentPane extends JPanel {
   public static final int PREF_W = 400;
   public static final int PREF_H = 400;

   public Dimension getPreferredSize() {
     return new Dimension(PREF_W, PREF_H);
   }
}

或者更好:

class MyContentPane extends JPanel {
   public int prefW;
   public int prefH;

public MyContentPane(int prefW, int prefH) {
   this.prefW = prefW;
   this.prefH = prefH;
}

   public Dimension getPreferredSize() {
     return new Dimension(prefW, prefH);
   }
}

正如其他海報所提到的,你必須在頂層窗口上使用pack()並使用布局管理器。

我自己不喜歡這樣做,而是讓各種組件的實際首選大小和容器的布局管理器為我做出所有決定。

  1. 在面板中制作你的ui。
  2. 設置面板的首選大小。
  3. 將面板添加到框架並調用pack()

你誤解了你正在使用的東西,所以它似乎“錯了”。

插入不是內容窗格之外的“內容”的維度。 它們類似於內容窗格周圍的“邊框”,不允許繪圖。 與邊界不同,插入不重疊。

窗口周圍的裝飾大小不是由程序決定的。 它由處理焦點和窗口導航的不同程序決定。 該程序稱為窗口管理器 窗口管理器處理“頂部標題欄”,它的高度,字體等。

要獲得“精確大小”程序,您需要向窗口管理器詢問無框架窗口,該窗口可以用Java完成。 它頂部不會有標題欄,也不會在邊緣附近調整大小句柄,窗口命令菜單,關閉的紅色“x”或者在桌面上移動窗口的方法(盡管你的程序可以重新定位自己如果這樣寫的話)。

另一種方法是在適當的尺寸和根窗格窗口中請求獨占的“屏幕”,這有時是通過游戲完成的。 這是一種限制性更強的處理方式,分辨率僅限於支持的屏幕尺寸。

如果您確實希望內容窗格是特定大小,而不是整個窗口是特定大小,請查看處理內容窗格首選大小的其他優秀答案。

  • BorderLayout (在JFrame API預先實現)忽略Insets

  • 大多數LayoutManager忽略Insets ,只有AbsoluteLayout需要,

基本和常見的東西

  • JFrame (和大多數Containers )只能返回InsetsBoundsSize

    a)來自已經可見的容器

    b)調用JFrame(ei)#pack()

  • 然后在大多數情況下設置InsetsBoundsSizeXxxSize而不是反作用,因為

    a)大多數JComponents都可以向其父級返回自己的和適當的PreferredSize

  • 但不包括在內

    a) Graphics(2D)

    b)空容器

    c) JScrollPaneJList / JTable ,在JScrollPane可以使用其容器調整大小的情況下,生成自己的代碼monstrum會產生相反的效果

暫無
暫無

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

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