java BoxLayout面板的对齐方式

whi*_*pgh 12 java user-interface swing layout-manager boxlayout

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

//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);
Run Code Online (Sandbox Code Playgroud)

最后两个面板的大小,类型5和类型6,大小相同,所以它们看起来很好.但是,标题和前4个面板的大小不同,我希望它们全部左对齐.到目前为止,我还没有找到一个很好的解决方案,如何解决这个问题.

问题是,我怎么能保持对齐前5个面板,而不是最后2个?如果不是,我怎么能将它们全部对齐?setalignmentx()不适用于面板.我已经使用网格布局尝试过,但随后的GUI的主窗口的宽度相当大,不能很好地适应屏幕,因此BoxLayout的沿Ÿaxis.Thanks任何帮助或建议.

cdc*_*cdc 26

下面是一个示例,它将保留所有添加到用作容器的面板的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);
Run Code Online (Sandbox Code Playgroud)

  • @mre为什么?对于此示例,它仅用于增加复杂性.代码简单易读.对于诸如此类的示例,简单性超过规律性. (7认同)
  • 请用适当的常数替换幻数. (4认同)
  • 方法`setAlignmentX`和`setAlignmentY`采用`float`,只是为了清楚.`JComponent`具有从`java.awt.Component`继承的以下对齐常量:`BOTTOM_ALIGNMENT`,`CENTER_ALIGNMENT`,`LEFT_ALIGNMENT`,`RIGHT_ALIGNMENT`,`TOP_ALIGNMENT`.使用这些使代码更具可读性,至少对我而言. (4认同)
  • 因为拥有和使用命名和系统常量总是比提供幻数更好? (2认同)

Ral*_*pin 14

创建一个水平javax.swing.Box对象以包含每个typenPanel对象.使用水平支柱和胶水,你可以做任何你想做的事情:

Box  b1 = Box.createHorizontalBox();
b1.add( type1Panel );
b1.add( Box.createHorizontalGlue() );
panel.add( b1 );
Run Code Online (Sandbox Code Playgroud)

为简单起见,编写一个帮助方法来为您执行此操作:

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;
}
Run Code Online (Sandbox Code Playgroud)

然后:

panel.add( leftJustify( headerPanel ) );
panel.add( leftJustify( type1Panel ) );
panel.add( leftJustify( type2Panel ) );
Run Code Online (Sandbox Code Playgroud)

等等....你可以通过每一行,添加组件,胶水和支柱来获得更好的体验.我有很好的运气深深地嵌套垂直和水平框,并且当我想在一个盒子中不止一次地做相同的布局时编写辅助方法.根据需要,您可以做什么,混合组件,支柱和胶水是没有限制的.

我确信有更好的方法可以做到这一切,但我还没有找到它.并且动态调整大小允许具有短文本的用户使用小窗口,并且具有大量文本的用户调整大小以使其完全适合.


Pau*_*aul 5

您应该setAlignmentX在面板上使用它,因为它可用于JPanel。这些方法setAlignmentXsetAlignmentY在发现JComponent,其中JPanel延伸。它的工作原理...我有使用这些方法来对齐JPanels的代码BoxLayout

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

代替使用JPanel尝试使用Box。我发现Box该类作为容器非常有用。从API:

使用BoxLayout对象作为其布局管理器的轻量级容器。Box提供了几种类方法,这些方法对于使用BoxLayout的容器(甚至是非Box容器)很有用。

如果您还没有看到它,那么“ 如何使用BoxLayout ”教程非常有帮助。