使用JSeperator时不寻常的差距 – Java

我一直在研究Swing GUI并在添加JSeperator后得到一些不寻常和不必要的空白,不知道如何删除它们? 或任何其他选项,如何很好地实现这一目标!

视觉描述

在此处输入图像描述

JLabel “速度”和JSlider之后,差距显而易见。

相关代码

 control.setLayout(new BoxLayout(control, BoxLayout.X_AXIS)); ...another code omitted... control.add(orientation); //JLabel control.add(norm); //JRadioButton control.add(back); //JRadioButton control.add(new JSeparator(SwingConstants.VERTICAL)); control.add(speedLabel); //JLabel control.add(speed); //JSlider control.add(new JSeparator(SwingConstants.VERTICAL)); control.add(turnOutLabel); //JLabel control.add(right); //JRadioButton control.add(straight); //JRadioButton control.add(left); //JRadioButton 

我想要的是让JSeperator把所有东西都集中在一起,

视觉描述

在此处输入图像描述

谢谢。

只需用以下行替换new JSeparator(...) (如果需要,可以将它们放在方法中):

 JSeparator separator = new JSeparator(JSeparator.VERTICAL); Dimension size = new Dimension( separator.getPreferredSize().width, separator.getMaximumSize().height); separator.setMaximumSize(size); 

正如@kleopatra解释的那样,JSeparator具有无限制的最大尺寸(两个方向),因此这里的技巧是将最大宽度限制为首选宽度,但仍保持最大高度不变(因为首选高度为0 )。

BoxLayout正在增加这些差距的原因是

  • 框架(面板)的宽度大于子项的总pref大小
  • JSeparator和JSlider有一个无界限(实际上是它的Short.Max)最大宽​​度,而其他所有其他内容都依赖于内容
  • BoxLayout尊重最大尺寸,因此所有超出部分都在这三者之间分配

FlowLayout根本不显示分隔符的原因,

  • JSeparator的pref高度为0
  • FlowLayout为每个孩子提供其pref大小

简单的方法是Howare的第一个建议:使用flowLayout将完整的控件添加到面板。 更强大的解决方案是切换到更强大的LayoutManager 🙂

(删除再次编辑,BorderLayout.south / north不;-)

将BoxLayout更改为新的FlowLayout(FlowLayout.LEFT)。 这应该工作。 不幸的是,我没有真正的解释为什么BoxLayout不适合你。

您可以使用FlowLayoutcontrol放入另一个面板中。

更新:不幸的是将control直接设置为flowlayout

 control.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); 

不起作用,因为分隔符的首选高度为零,分隔符将消失。