2012-10-03 55 views
2

這是我使用實例化一個JFrame的代碼示例:Insets.top,左,下,右全零

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上。

我在做什麼錯?

回答

5
  1. 如果你希望你的內容窗格中要精確400×400,那麼我會考慮它的首選大小設置爲400×400(雖然我不喜歡逼首選大小,在內容窗格,它是可以接受的,在一些例)。
  2. 在設置好首選尺寸和顯示幀之前,請在框架上撥打pack()

這是最乾淨和最簡單的解決方案,而且您不必關心邊界插頁。

+0

我的想法確切。 1+ –

+0

考慮重寫['getPreferredSize()'](http://stackoverflow.com/q/7229226/230513);以前upvoted。 – trashgod

+0

@trashgod出於好奇,爲什麼重寫比設置首選大小更好? –

5

如果contentPane的應該是完全400×400,然後創建一個retuns這爲它的首選大小的一類,並把它作爲的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()並使用佈局管理器。

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

+0

+1,我們得出了相同的結論。雖然簡單地設置首選大小也可以,並且不需要擴展JPanel。 –

+0

@Guillaume:我同意,但我討厭被kleopatra/Jeanette設置preferredSize,因此我嘗試通過方法重寫來實現。 –

+0

我討厭這個;-)但是在這種情況下,這個問題似乎是一個非常有效的方法。最後,結果是一樣的,這就是所有重要的事情:-) –

2
  1. 在面板中製作你的用戶界面。
  2. 設置面板的首選尺寸。
  3. 添加面板框架,並呼籲pack()
+0

這是行不通的。嘗試運行這個並檢查會發生什麼:'JFrame frame = new JFrame(); \t \t \t \t JLabel label = new JLabel(「Some label」); \t \t \t \t frame.getContentPane()。add(label); \t \t \t \t frame.getContentPane()。setSize(400,400); \t \t \t \t frame.pack(); \t \t \t \t frame.setVisible(真);' –

+0

我說的是不是在內容窗格中,而是直接添加另一個面板上,我們設置的大小 –

+0

框架上添加面板框架是完全一樣的作爲添加到內容窗格。即使您添加中介面板,它仍然無法工作。 –

2

你是誤會你們所做的工作,所以會顯得「錯誤的」。

插入不是內容窗格之外的「東西」的尺寸。它們與內容窗格周圍的「邊框」類似,在此處不允許繪圖。不同於邊界,插頁不重疊。

裝飾大小該窗口不是由程序決定的。它由一個不同的程序決定,它處理焦點和窗口導航。該程序被稱爲窗口管理器。它是處理「頂部標題欄」的窗口管理器,它的高度,字體等。

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

另一種方法是請求適當維度和根窗格窗口中的獨佔「屏幕」,有時通過遊戲進行。這是一種更具限制性的做事方式,分辨率僅限於支持的屏幕尺寸。

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

0
  • BorderLayout(在JFrame API pre_implemented)忽略Insets

  • 大部分LayoutManager忽視Insets太多,只需要在AbsoluteLayout

基礎性,共性的東西

  • JFrame(和大部分Containers)可返回InsetsBoundsSize只有

    一)從已經顯現容器

    b)在呼叫JFrame(e.i.)#pack()

  • 然後在大多數情況下是設置爲InsetsBounds,Size,XxxSize超過反例,因爲

    a)大部分JComponents回報可以自己和適當PreferredSize到它的父,

  • ,但不包括

    一個)Graphics(2D)

    b)中對空容器

    c)中JScrollPane & JList/JTable,有contraproductive於生成在JScrollPane與其容器可調整大小寫的情況下自己的代碼monstrum