2011-06-24 222 views
2

是否可以使用JPanel的大小來設置JPanel內的組件的大小?當我嘗試在JPanel上使用getHeight()或getWidth()時,它總是返回0.我知道一旦JFrame被打包就會得到它的大小,但是如何使用JPanel的維度並將其應用於它裏面的組件?像這樣的東西java使用JPanel的大小來設置組件的大小

JPanel panel = new JPanel(); 
JLabel label = new JLabel(); 
label.setWidth(panel.getWidth()); 
panel.add(label); 

編輯: 請參閱下面的示例代碼。如果我想讓我的Jlabel和我的JPanel一樣寬,我應該怎麼做?在這種情況下使用boxlayout是錯誤的嗎?

public class Main extends JFrame{ 

public Main(){ 
    JPanel panel = new JPanel(); 
    panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); 
    panel.setBorder(BorderFactory.createLineBorder(Color.blue)); 

    JLabel label = new JLabel(); 
    label.setBorder(BorderFactory.createLineBorder(Color.red)); 
    label.setText("label1"); 
    label.setMinimumSize(panel.getPreferredSize()); 
    label.setPreferredSize(panel.getPreferredSize()); 
    panel.add(label); 


    add(panel); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    pack(); 
    setSize(500,500); 
    setVisible(true); 
} 

public static void main(String[] args) 
{ 
    new Main(); 
} 

}

+1

嘗試'panel.getPreferredSize().width' – oliholz

+0

@oliholz,正如你在我上面的例子中看到的那樣,我嘗試過但是沒有奏效。當我打印出面板的首選尺寸時,它的寬度和高度都是2。但是,當Jframe出現時,面板邊框與整個jframe的大小几乎相同 – jhlu87

回答

3

是否可以使用JPanel的大小來設置JPanel內部組件的大小?

這是佈局經理的工作。

當我嘗試它總是返回0

當佈局管理器調用容器將有一個有效的大小,這樣的佈局管理器可以做的JPanel使用的getHeight()或的getWidth()它的工作正常。

沒有理由讓你玩尺寸。留給佈局經理去完成他們的工作。

更新:

,我應該怎麼做,如果我想我的JLabel以寬是我的JPanel的?在這種情況下使用boxlayout是錯誤的嗎?

BoxLayout嘗試尊重組件的最小/最大尺寸。在你的情況下,你應該可以這樣做:

JLabel label new JLabel("some text"); 
label.setBorder(....); 
Dimension d = label.getPreferredSize(); 
d.width = 32767; 
label.setMaximumSize(d); 

或者也許一個更簡單的方法是以BorderLayout開始。您可以將標籤添加到NORTH。然後創建另一個面板並將其添加到CENTER中。

+0

所以你是說如果我不滿意的尺寸,那麼我一定是使用錯誤的佈局? – jhlu87

+0

是的,你可以嵌套不同的佈局管理器來獲得所需的效果。查看更新。 – camickr

1

當然可以,但要小心的是,結果取決於您的JPanel的佈局管理器和它的子組件數。

+0

@Overbose,你可以看看我編輯過的示例並給出更多細節嗎? – jhlu87

0

設置寬度忽略調整大小。佈局管理員通常會詢問組件的首選寬度和高度,並在展開框架調整大小後展開/收縮項目以保持視覺吸引力的位置。因此,您最好的選擇是利用佈局管理器並報告「首選寬度」。

您可以使用setPreferredWidth(...);但是,如果您的首選寬度將隨着程序的運行而改變(由於窗口大小的改變),您需要聽取相關面板的信息,並根據面板的首選寬度更改更新按鈕的首選寬度(假設它會更改,這可能不是真的)。