14

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

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

4

3 回答 3

29

这是一个示例,它将左对齐添加到用作容器的面板中的所有 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);
于 2012-02-09T14:08:17.877 回答
16

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

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

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

于 2012-02-09T15:00:43.590 回答
5

您应该setAlignmentX在面板上使用它,因为它可用于JPanel. 方法setAlignmentXsetAlignmentY位于扩展中JComponentJPanel它有效...我有代码使用这些方法将 JPanels 对齐到BoxLayout.

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

而不是使用 JPanel 尝试使用Box. 我发现Box该类作为容器非常有用。从 API:

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

如果您还没有看过,教程How to Use BoxLayout非常有帮助。

于 2012-02-09T14:08:17.380 回答