Java BoxLayout 面板的对齐方式

15

我已经浏览了一些内容,但没有找到特别适合我的解决方案。我有一个面板,在对话框中显示:

//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。谢谢任何帮助或建议。

目前正在处理以下内容: headerPanel.setAlignmentX(Component.LEFT_ALIGNMENT); 但似乎有些随意。我看到有人提到要避免这样做。 - whitewolfpgh
“setAlignmentX()不适用于面板。” - “setAlignmentX()对我是可用的。您能否澄清一下?” - Thomas
1
我找到了问题所在。如果你先执行panel.add(headerPanel);然后再执行headerPanel.setAlignmentX(Component.LEFT_ALIGNMENT);它就无法正确对齐。然而,如果你先进行对齐操作,然后再将headerPanel添加到对话框的面板中,它就可以正常工作。真是匪夷所思。 - whitewolfpgh
我曾使用headerPanel.setAlighmentX(Component.LEFT_ALIGNMENT);。setAlignmentX需要一个浮点型的参数,但是它并没有起作用。 - whitewolfpgh
3个回答

30

下面是一个示例,它将左对齐添加到作为容器使用的面板中的所有JPanels。

   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);

5
方法setAlignmentXsetAlignmentY需要传入一个float参数,这点需要明确一下。JComponent继承自java.awt.Component,具有以下对齐常量:BOTTOM_ALIGNMENTCENTER_ALIGNMENTLEFT_ALIGNMENTRIGHT_ALIGNMENTTOP_ALIGNMENT。使用这些常量可以使代码更易读,至少对我来说是这样的。 - Paul
7
为什么?对于这个例子来说,它只会增加复杂度。代码已经足够简单易读了。对于这种示例,简单比规范更重要。 - Andrew S
2
因为拥有和使用命名和系统常量总是比提供魔数更好? - user719662

17

创建一个水平的javax.swing.Box对象来容纳每个typenPanel对象。使用水平的strut和glue,您可以做任何您想做的事情:

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 ) );

你可以在每一行里使用更多的组件、粘合剂和支架,使它变得更加复杂。我在嵌套垂直和水平框时运气很好,并且当我想在一个框中多次进行相同的布局时编写辅助方法。你可以无限制地做任何事情,必要时混合使用组件、支架和粘合剂。

我相信有更好的方法可以完成所有这些工作,但我还没有找到它。动态调整大小允许短文本的用户使用小窗口,而具有大量文本的用户可以调整窗口大小以适应所有内容。


5
你应该在面板上使用setAlignmentX,因为它适用于JPanel。方法setAlignmentXsetAlignmentY位于JComponent中,而JPanel则继承自它。它可以正常工作...我有使用这些方法来对齐BoxLayout中的JPanel的代码。
好的,没问题,在我回答时编辑你的问题:)
不要使用JPanel,而是尝试使用Box。我发现Box类作为容器非常有用。来自API:

一个轻量级容器,其使用BoxLayout对象作为其布局管理器。 Box提供了几个对于使用BoxLayout的容器有用的类方法,甚至包括非Box容器。

如果你还没有看过,教程如何使用BoxLayout非常有帮助。

谢谢。setAlignmentX 对于所有 JComponent 实例都非常有用。 - KomodoDave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接