2014-07-25 42 views
1

我有一個包含子面板的BoxLayout管理器的JPanel。我希望這些子面板內的組件具有左對齊,但它們總是顯示居中。 它看起來像BoxLayout正確地對齊直接插入的組件,但是當它們位於子面板內時,則無法做到這一點。BoxLayout忽略子面板對齊

我已經修改http://www.java2s.com/Tutorial/Java/0240__Swing/YAxisAlignment.htm發現這個例子,每個按鈕被放置在子面板內,然後將子面板被放置在BoxLayout的經理主面板中:

public class YAxisAlignX { 
    private static Container makeIt(String title, float alignment) { 
    String labels[] = { "--", "----", "--------", "------------" }; 

    JPanel container = new JPanel(); 
    container.setBorder(BorderFactory.createTitledBorder(title)); 
    BoxLayout layout = new BoxLayout(container, BoxLayout.Y_AXIS); 
    container.setLayout(layout); 

    // modified loop. the original version does not create JPanel pan. 
    // adds the buttons directly the the JPanel container with the 
    // BoxLayout 
    for (int i = 0, n = labels.length; i < n; i++) { 
     JPanel pan = new JPanel(); 
     JButton button = new JButton(labels[i]); 
     pan.add(button); 
     button.setAlignmentX(alignment); 
     pan.setAlignmentX(alignment); 
     container.add(pan); 
    } 
    return container; 
    } 

    public static void main(String args[]) { 
    JFrame frame = new JFrame("Alignment Example"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    Container panel1 = makeIt("Left", Component.LEFT_ALIGNMENT); 
    Container panel2 = makeIt("Center", Component.CENTER_ALIGNMENT); 
    Container panel3 = makeIt("Right", Component.RIGHT_ALIGNMENT); 

    Container contentPane = frame.getContentPane(); 
    contentPane.setLayout(new FlowLayout()); 
    contentPane.add(panel1); 
    contentPane.add(panel2); 
    contentPane.add(panel3); 

    frame.pack(); 
    frame.setVisible(true); 
    } 
} 

如果執行此版本中,您可以看到按鈕都居中,儘管設置了對齊。這是爲什麼發生?有沒有解決方法?就我而言,每個子面板都包含多個組件,我不想直接添加到主面板。

非常感謝。

回答

2

但它們是一致的!

首先,setAlignmentX在JComponent級別更改屬性,這些組件放置的佈局可能會或可能不會使用此信息。例如,BoxLayout使用它,但FlowLayoutBorderLayout不使用。

在你的情況下,你正在將一些面板放置在一個垂直的BoxLayout上,並且你正在以各種方式對齊它們,並且它可以工作!只是碰巧面板伸展自己以適應整個列,所以實際上對齊不會改變它們的外觀。

pan.setBorder(BorderFactory.createLineBorder(Color.red)); 

參見:

enter image description here

,該面板包含一個按鈕或其他任何東西大多是無關緊要的事實(它只是影響大小,你可以通過設置圍繞面板邊框看到這該面板想要採取,而不是肯定),BoxLayout是對齊面板而不是面板內有什麼,這是每個面板佈局的工作。這就是爲什麼按鈕不會受到BoxLayout影響的對齊方式。

現在這些按鈕如何決定其對齊?那麼這取決於它們的佈局。這些按鈕位於pan面板內,該面板使用默認的LayoutManager FlowLayout。現在,正如我所說的,FlowLayout不關心對齊X/Y屬性,所以行:

button.setAlignmentX(alignment); 

沒有完成任何事情。要在FlowLayout中,你需要通過FlowLayout.setAligment(int)(docs)改變其alignment場對齊,你也可以做到這一點在構造函數中,所以如果我們改變pan聲明:

JPanel pan = new JPanel(new FlowLayout(FlowLayout.LEFT)); 

你也有按鈕對齊左其面板內:

//img

當然,所有的列對齊因爲參數左側的makeIt不影響的FlowLayout的ALIG float alignment只是BoxLayout的一個(並不重要)。您可能需要將該參數更改爲int,然後使用不同的常量調用該函數。

總而言之,在原有版本的行button.setAlignmentX(alignment);是有道理的,因爲按鈕直接添加到container面板和BoxLayout的對準他們正確:

enter image description here

但是一旦你把按鈕內其他面板,BoxLayout開始對齊面板(這是因爲面板如何在BoxLayout內部工作,它們被拉伸以填充整個寬度)而不是按鈕,並且按鈕對齊取決於面板佈局。這就是它的工作方式,所以我們可以製作一致的嵌套佈局。

我希望這很清楚。

+0

謝謝您的明確解釋! – karmapolice