2012-02-09 80 views
9

我瀏覽過並沒有找到專門針對我的情況的解決方案。我有一個對話框顯示面板:java BoxLayout面板的對齊

//create dialog panel 
JPanel panel = new JPanel(); 
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
panel.add(headerPanel); 
panel.add(type1Panel); 
panel.add(type2Panel); 
panel.add(type3Panel); 
panel.add(type4Panel); 
panel.add(type5Panel); 
panel.add(type6Panel); 

int result = JOptionPane.showConfirmDialog(null, panel, "Please enter values.", JOptionPane.OK_CANCEL_OPTION); 

最後兩個面板的大小,成的Type5 & TYPE6,大小相等,所以他們看起來很好。不過,標題和前4個面板大小不同,我希望它們全部左對齊。到目前爲止,我還沒有找到一個很好的解決辦法來解決這個問題。

問題是,我該如何左對齊前5個面板,但不是最後2個?如果不是,我怎麼能把它們全部對齊? setalignmentx()不適用於面板。我嘗試過使用GridLayout,但是然後gui的主窗口的寬度相當大,並且不適合在屏幕上,因此沿Y軸方向BoxLayout。謝謝任何幫助或建議。

+0

現在使用這個權利: headerPanel。setAlignmentX(Component.LEFT_ALIGNMENT); 但似乎是愚蠢的。我看到有人提到要避免這樣做。 – whitewolfpgh 2012-02-09 14:07:38

+0

'setalignmentx()不適用於panel.' - 'setAlignmentX()'可用於我。你能澄清嗎? – Thomas 2012-02-09 14:08:22

+1

嗯,我想出了問題。如果你做panel.add(headerPanel);然後做headerPanel.setAlignmentX(Component.LEFT_ALIGNMENT);它不會正確對齊。但是,首先進行對齊,然後將headerPanel添加到對話框的面板中,它工作得很好。去搞清楚。 – whitewolfpgh 2012-02-09 14:11:35

回答

22

這是一個將左對齊添加到用作容器的面板的所有JPanel的示例。

JPanel a = new JPanel(); 
    JPanel b = new JPanel(); 
    JPanel c = new JPanel(); 

    a.setBackground(Color.RED); 
    b.setBackground(Color.GREEN ); 
    c.setBackground(Color.BLUE); 

    a.setMaximumSize(new Dimension( 10, 10)); 
    b.setMaximumSize(new Dimension( 50, 10)); 

    a.setAlignmentX(Component.LEFT_ALIGNMENT);//0.0 
    b.setAlignmentX(Component.LEFT_ALIGNMENT);//0.0 
    c.setAlignmentX(Component.LEFT_ALIGNMENT);//0.0 

    JPanel panel = new JPanel(); 
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
    panel.add(a); 
    panel.add(b); 
    panel.add(c); 

    int result = JOptionPane.showConfirmDialog(null, panel, "Please enter values.", JOptionPane.OK_CANCEL_OPTION); 
+4

請用適當的常數替換幻數。 – mre 2012-02-09 14:16:17

+3

'setAlignmentX'和'setAlignmentY'方法採用'float',只是爲了清楚。 「JComponent」具有從java.awt.Component繼承的以下對齊常量:BOTTOM_ALIGNMENT,CENTER_ALIGNMENT,LEFT_ALIGNMENT,RIGHT_ALIGNMENT,TOP_ALIGNMENT。至少對我來說,使用這些代碼使代碼更具可讀性。 – Paul 2012-02-09 14:19:08

+4

@mre爲什麼?對於這個例子,它只是爲了增加複雜性。該代碼簡單易讀。例如這樣的例子可以簡單地規則化。 – 2014-04-04 10:16:02

4

您應該在面板上使用setAlignmentX,因爲它可用於JPanel。方法setAlignmentXsetAlignmentYJComponent中找到,JPanel延伸。它的工作原理...我有代碼使用這些方法來對齊BoxLayout中的JPanel。

好,做工精細,編輯你的問題,而我回答吧:)

而不是使用一個JPanel嘗試使用Box的。我發現Box類作爲容器非常有用。從API:

輕量級容器,它使用BoxLayout對象作爲其佈局 管理器。 Box提供了幾種使用BoxLayout的容器對於 容器有用的類方法 - 甚至是非Box容器。

如果您還沒有看到,教程How to Use BoxLayout是非常有用的。

+0

感謝您的支持。 'setAlignmentX'對所有'JComponent'實例都很有用。 – KomodoDave 2013-04-21 09:31:35

11

創建一個水平的javax.swing.Box對象來包含每個typenPanel對象。使用任何你想要的水平支桿和膠水,你可以這樣做:

Box b1 = Box.createHorizontalBox(); 
b1.add(type1Panel); 
b1.add(Box.createHorizontalGlue()); 
panel.add(b1); 

爲了簡單起見,寫一個輔助方法來爲你做這個:

private Component leftJustify(JPanel panel) { 
    Box b = Box.createHorizontalBox(); 
    b.add(panel); 
    b.add(Box.createHorizontalGlue()); 
    // (Note that you could throw a lot more components 
    // and struts and glue in here.) 
    return b; 
} 

然後:

panel.add(leftJustify(headerPanel)); 
panel.add(leftJustify(type1Panel)); 
panel.add(leftJustify(type2Panel)); 

等。 ...你可以在每條線上添加更多元素,添加組件,膠水和支柱。當我想在一個盒子裏多次做同樣的佈局時,我已經深深地嵌套了垂直和水平方框,並且寫了幫助器方法。你可以做什麼沒有限制,根據需要混合組件,支柱和膠水。

我相信還有更好的方法來做到這一點,但我還沒有找到它。動態調整大小讓用戶使用短小的文本使用一個小窗口,並且擁有大量文本的用戶調整大小以適應所有情況。