BoxLayout忽略子面板对齐

时间:2014-07-25 12:01:54

标签: java swing alignment layout-manager boxlayout

我有一个带有BoxLayout管理器的JPanel,它包含子面板。我希望这些子面板中的组件具有左对齐,但它们始终显示为居中。 看起来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);
  }
}

如果执行此版本,您可以看到按钮全部居中,尽管设置了对齐方式。为什么会这样?有什么解决方案吗?在我的例子中,每个子面板都包含几个组件,我不想直接添加到主面板。

非常感谢。

1 个答案:

答案 0 :(得分:2)

但他们是一致的!

首先,setAlignmentX更改JComponent级别的属性,放置这些组件的布局可能会也可能不会使用此信息。例如,BoxLayout使用它,但FlowLayoutBorderLayout不会。

在您的情况下,您正在放置一些带有垂直BoxLayout的面板,并且您正在以各种方式对齐它们,并且它可以正常工作!事实上,面板伸展自身以适应整个柱子,因此实际对齐并不会改变它们的外观。您可以通过在面板周围设置边框来看到这一点:

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

请参阅:

enter image description here

面板包含一个按钮或其他任何东西的事实大多无关紧要(它只影响面板想要采取的尺寸,而不是绝对的),BoxLayout正在对齐面板而不是面板内部的那些,&# 39;每个小组布局的工作。这就是为什么按钮不会受BoxLayout影响的原因。

现在这些按钮如何决定它的对齐方式?那就是它们所处的布局。这些按钮位于使用默认LayoutManager pan的{​​{1}}面板内。现在,正如我所说,FlowLayout并不关心alignmentX / Y属性所以行:

FlowLayout

没有做任何事情。要在FlowLayout中对齐,您需要通过button.setAlignmentX(alignment); (docs)更改其alignment字段,您也可以在构造函数中执行此操作,因此如果我们将FlowLayout.setAligment(int)声明更改为:

pan

您还可以在面板内左侧对齐按钮:

//img

当然,所有列都对齐到左边,因为JPanel pan = new JPanel(new FlowLayout(FlowLayout.LEFT)); 的参数float alignment不会影响FlowLayout的对齐,只是BoxLayout的对齐(并且它没有& #39; t))。您可能希望将该参数更改为int,并使用不同的makeIt常量调用该函数。

总而言之,在原始版本中,行FlowLayout有意义,因为按钮已直接添加到button.setAlignmentX(alignment);面板,BoxLayout正确对齐它们:

enter image description here

然而,一旦你将按钮放在其他面板中,BoxLayout就会开始对齐面板(由于面板如何在BoxLayout中工作,它们被拉伸以填充整个宽度)而不是按钮,按钮对齐是由面板布局。这就是它如何工作所以我们可以制作一致的嵌套布局。

我希望这很清楚。