【问题标题】:java BoxLayout panel's alignmentjava BoxLayout 面板的对齐方式
【发布时间】:2012-03-01 23:59:58
【问题描述】:

我四处浏览,并没有找到专门针对我的情况量身定制的解决方案。我有一个显示在对话框中的面板:

//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);但似乎是心甘情愿。我见过有人提到要避免这样做。
  • The setalignmentx() isn't available for panels. - setAlignmentX() 可供我使用。你能澄清一下吗?
  • 好吧,我发现了问题所在。如果你做 panel.add(headerPanel);然后做 headerPanel.setAlignmentX(Component.LEFT_ALIGNMENT);它不会正确对齐。但是,首先进行对齐,然后将 headerPanel 添加到对话框的面板中它工作得很好。去图吧。
  • 我使用的是 headerPanel.setAlighmentX(Component.LEFT_ALIGNMENT);。 setAlignmentX 正在寻找浮点类型?并且没有工作。

标签: java swing user-interface layout-manager boxlayout


【解决方案1】:

这是一个将添加到用作容器的面板中的所有 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);

【讨论】:

  • 方法setAlignmentXsetAlignmentY 采用float,只是为了清楚起见。 JComponent 具有以下从 java.awt.Component 继承的对齐常量:BOTTOM_ALIGNMENTCENTER_ALIGNMENTLEFT_ALIGNMENTRIGHT_ALIGNMENTTOP_ALIGNMENT。使用这些使代码更具可读性,至少对我而言。
  • @mre 为什么?对于此示例,它仅用于增加复杂性。代码简单易读。像这样的例子,简单而不是规律。
  • 因为拥有和使用命名和系统常量总是比提供幻数更好?
【解决方案2】:

创建一个水平 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 ) );

等等......你可以在每一行中变得更漂亮,添加组件、胶水和支柱。我很幸运地深度嵌套了垂直和水平框,并且当我想在一个框中多次进行相同的布局时编写辅助方法。您可以做的事情没有任何限制,可以根据需要混合组件、支柱和胶水。

我确信有更好的方法来完成这一切,但我还没有找到。动态调整大小让文本较短的用户可以使用小窗口,而文本较多的用户可以调整其大小以使其适合所有内容。

【讨论】:

    【解决方案3】:

    您应该在面板上使用setAlignmentX,因为它可用于JPanel。方法setAlignmentXsetAlignmentYJComponent 中找到,JPanel 扩展了这些方法。它有效...我有代码使用这些方法在 BoxLayout 中对齐 JPanel。

    好的,好的,在我回答的时候编辑你的问题:)

    尝试使用Box,而不是使用JPanel。我发现Box 类作为容器非常有用。来自 API:

    使用 BoxLayout 对象作为其布局的轻量级容器 经理。 Box 提供了几个类方法 使用 BoxLayout 的容器——甚至是非 Box 容器。

    如果你还没有看过,教程How to Use BoxLayout 很有帮助。

    【讨论】:

    • 谢谢。 setAlignmentX 适用于所有 JComponent 实例。
    猜你喜欢
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2014-12-01
    • 1970-01-01
    • 2012-11-06
    • 2017-05-20
    • 1970-01-01
    相关资源
    最近更新 更多