使用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不适合你。
您可以使用FlowLayout
将control
放入另一个面板中。
更新:不幸的是将control
直接设置为flowlayout
control.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
不起作用,因为分隔符的首选高度为零,分隔符将消失。