我有一个带有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);
}
}
如果执行此版本,您可以看到按钮全部居中,尽管设置了对齐方式。为什么会这样?有什么解决方案吗?在我的例子中,每个子面板都包含几个组件,我不想直接添加到主面板。
非常感谢。
答案 0 :(得分:2)
但他们是一致的!
首先,setAlignmentX
更改JComponent级别的属性,放置这些组件的布局可能会也可能不会使用此信息。例如,BoxLayout
使用它,但FlowLayout
和BorderLayout
不会。
在您的情况下,您正在放置一些带有垂直BoxLayout的面板,并且您正在以各种方式对齐它们,并且它可以正常工作!事实上,面板伸展自身以适应整个柱子,因此实际对齐并不会改变它们的外观。您可以通过在面板周围设置边框来看到这一点:
pan.setBorder(BorderFactory.createLineBorder(Color.red));
请参阅:
面板包含一个按钮或其他任何东西的事实大多无关紧要(它只影响面板想要采取的尺寸,而不是绝对的),BoxLayout正在对齐面板而不是面板内部的那些,&# 39;每个小组布局的工作。这就是为什么按钮不会受BoxLayout
影响的原因。
现在这些按钮如何决定它的对齐方式?那就是它们所处的布局。这些按钮位于使用默认LayoutManager pan
的{{1}}面板内。现在,正如我所说,FlowLayout并不关心alignmentX / Y属性所以行:
FlowLayout
没有做任何事情。要在FlowLayout中对齐,您需要通过button.setAlignmentX(alignment);
(docs)更改其alignment
字段,您也可以在构造函数中执行此操作,因此如果我们将FlowLayout.setAligment(int)
声明更改为:
pan
您还可以在面板内左侧对齐按钮:
当然,所有列都对齐到左边,因为JPanel pan = new JPanel(new FlowLayout(FlowLayout.LEFT));
的参数float alignment
不会影响FlowLayout的对齐,只是BoxLayout的对齐(并且它没有& #39; t))。您可能希望将该参数更改为int,并使用不同的makeIt
常量调用该函数。
总而言之,在原始版本中,行FlowLayout
有意义,因为按钮已直接添加到button.setAlignmentX(alignment);
面板,BoxLayout正确对齐它们:
然而,一旦你将按钮放在其他面板中,BoxLayout就会开始对齐面板(由于面板如何在BoxLayout中工作,它们被拉伸以填充整个宽度)而不是按钮,按钮对齐是由面板布局。这就是它如何工作所以我们可以制作一致的嵌套布局。
我希望这很清楚。