使用JSeperator-Java时出现的异常间隙

使用JSeperator-Java时出现的异常间隙,java,swing,user-interface,awt,layout-manager,Java,Swing,User Interface,Awt,Layout Manager,我一直在开发一个Swing GUI,在添加了JSeperator之后,我发现了一些不寻常和不必要的漏洞,你知道如何消除这些漏洞吗?或任何其他选择,以实现这一点很好 视觉描述 在JLabel“速度”之前和JSlider之后,间隙非常明显 相关代码 control.setLayout(new BoxLayout(control, BoxLayout.X_AXIS)); ...another code omitted... control.add(orientation); //JLabel c

我一直在开发一个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集中和分开

视觉描述


谢谢。

将BoxLayout更改为新的FlowLayout(FlowLayout.LEFT)。这应该行得通。不幸的是,我没有一个真正的解释为什么BoxLayout不适合您

您可以将
控件
放入另一个带有
流程布局的面板

更新:不幸的是,通过将
控件直接设置为flowlayout

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

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

BoxLayout添加这些间隙的原因是

  • 帧(面板)的宽度大于子帧的总pref大小
  • JSepator和JSlider有一个无界的最大宽度(实际上是Short.Max),而其他所有的都有一个与内容相关的最大宽度
  • BoxLayout尊重最大尺寸,因此所有多余的尺寸都分布在这三个尺寸之间
FlowLayout根本没有显示分离器的原因

  • JSepator的pref高度为0
  • FlowLayout为每个子级提供其pref大小
简单的解决方法是Howare的第一个建议:使用flowLayout将完整控件添加到面板中。更可靠的解决方案是切换到功能更强大的LayoutManager:-)


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

只需用以下行替换新的JSepator(…)
(如果需要,可以将它们放在方法中):


正如@kleopatra所解释的,jsepator具有无限的最大大小(在两个方向上),因此这里的技巧是将最大宽度限制为首选宽度,但仍然保持最大高度不变(因为首选高度为
0
).

您是否尝试过水平粘合或为您的
jsepator
实例实现空边框?@mrkhrts-glue没有帮助,它很简单,只需再添加一个具有无限最大值的组件;-)如果我使用FlowLayout,Swing docent show JSeperator:(,非常有趣。@SkeetOverFlow你是对的。因此你可以始终将其放入另一个容器中。如果我使用FlowLayout,Swing docent show JSeperator:(,非常有趣。Nonono…从不设置XXSize-这条规则适用于…以及所有人(包括你和我)它确实有效,但现在我不应该像你说的那样对大O(不),我会试试Howard的建议,我想它应该有效!@kleopatra Dam!我以为你和我是免疫的,可以做到;-)不过,说真的,我觉得上面的片段并不重要(只要没有硬编码的像素大小出现,我看起来还是可以接受的)@kleopatra,
jsepator
的这种行为在我看来也有问题:对于垂直分隔符,最大宽度应该是恒定的(与pref宽度相同),对于水平分隔符,最大高度应该是恒定的(与pref高度相同)。@kleopatra你会发现固定最大大小的jsepator子类更容易接受吗?
JSeparator separator = new JSeparator(JSeparator.VERTICAL);
Dimension size = new Dimension(
    separator.getPreferredSize().width,
    separator.getMaximumSize().height);
separator.setMaximumSize(size);