2011-07-09 60 views
1

我想我解決了我的問題,但我不知道它爲什麼這樣工作,所以我希望有人能解釋它所以我今後不會再犯同樣的錯誤。我不能讓BoxLayout的setPreferredSize()方法以我想要的方式工作

這裏有一個簡單的例子是編譯的我想要做的事:

public class BoxLayoutTest extends JFrame 
{ 
    public BoxLayoutTest() 
    { 
    setSize(400,300); 
    JPanel mainPanel = new JPanel(new FlowLayout()); 
    setContentPane(mainPanel); 

    JPanel subPanel = new JPanel(); 
    subPanel.setLayout(new BoxLayout(subPanel, BoxLayout.PAGE_AXIS)); 
    subPanel.setBackground(Color.BLUE); 

    JLabel labelTest = new JLabel("This is a test"); 
    subPanel.add(labelTest); 

    labelTest.setPreferredSize(new Dimension(150, 20)); 
    mainPanel.add(subPanel); 
    System.out.println(mainPanel.getSize()); 
    } 

    public static void main(String[] args) 
    { 
    BoxLayoutTest testFrame = new BoxLayoutTest(); 
    testFrame.setVisible(true); 
    } 
} 

起初,我曾與含JLabel的調整不喜歡它應該具有最佳尺寸面板的問題。我發現這是因爲我使用mainPanel.getSize()的一些變體作爲我的子面板的首選大小。在這個例子中,我使用了實際的數字值,這些值是有效的。爲什麼它沒有以舊的方式工作(這實際上是我想要某人解釋的事情),就是爲什麼,如在SOP行中看到的,mainPanel.getSize()返回一個寬度和一個高度爲0,而顯然需要整個屏幕,這是400×300。

感謝@camickr告訴我,我不應該爲我的面板設置首選大小,這幫助我找出問題來自哪裏。

回答

2

爲什麼[請] mainPanel.getSize()返回寬度和高度爲0?

直到pack()「導致此Window的大小,以適合其子組件的優選尺寸和佈局,」尺寸將是零。

System.out.println(mainPanel.getSize()); 
this.pack(); 
System.out.println(mainPanel.getSize()); 

控制檯:我註釋掉方法

 
java.awt.Dimension[width=0,height=0] 
java.awt.Dimension[width=160,height=30] 
+0

謝謝!這解釋了它! –

2

很難說爲什麼你的代碼不起作用,因爲你沒有發佈你的代碼。一些隨機的代碼行並沒有給我們提供如何在你的程序中使用代碼的上下文。

當你發佈一個問題,你需要發表您的問題SSCCE

膠水不應該解決問題。面板仍然應該顯示,只是它可能不會顯示在您期望的位置。 BoxLayout將嘗試調整添加到其中的組件的大小,以填充可用的整個空間。

您不應該在面板上使用setPreferredSize()。佈局經理的工作是根據添加到其中的所有組件的首選大小來計算面板的首選大小。所以我會說你的代碼還是錯的。

有打字和this.getContentPane()

某些方法調用被自動轉發到框架上,這就是爲什麼最終結果是相同的內容窗格之間的差。閱讀JFrame API。這在API說明或有關方法中得到解決。

+0

我知道我應該張貼SSCCE,但我貼最多(90%+)棒材變量聲明。我有其餘的評論,這就是我試圖隔離問題並將其發佈在這裏。膠水本身並沒有真正修復它,但我可以通過這種方式模擬更大的面板。把它放到上下文中,這是一個標題欄,應該將整個屏幕寬度放在頂部。它只是圍繞着JLabel,儘管這不是我想要的。當我將佈局更改爲flowLayout時,一切正常。很抱歉,如果我的代碼示例不夠清晰。 –

+0

我接受了您的建議,並從JPanel中刪除了setPreferredSize,並將其用於JLabel。它不起作用。但是,如果我使用setMaximumSize,它會起作用,這意味着我實際上並不瞭解preferredSize的工作方式,因爲我認爲如果容器有足夠的空間來使用preferredSize,那麼preferredSize就是使用的大小。 –

相關問題