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

发布于 2024-12-06 11:24:10 字数 979 浏览 0 评论 0 原文

我一直在开发 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分隔,

视觉描述

谢谢。

I have been working on a Swing GUI and getting some unusual and unwanted gaps after adding JSeperator, Any idea how to remove them? Or any other option to how to achieve this nicely!

Visual Description

enter image description here

Gaps are apparent before JLabel "Speed" and after JSlider.

Related Code

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

What I want is to Have have everything centred and separated by JSeperator,

Visual Description

enter image description here

Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

凶凌 2024-12-13 11:24:10

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

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

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

Just replace new JSeparator(...) with the following lines (you can put them in a method if you want):

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

As @kleopatra explained, JSeparator has unbounded maximum size (in both directions), so the trick here is to limit the max width to the preferred width, but still keep the max height unchanged (because the preferred height is 0).

ヤ经典坏疍 2024-12-13 11:24:10

BoxLayout 添加这些间隙的原因是

  • 框架(面板)的宽度大于子级
  • JSeparator 和 JSlider 的总首选项大小,它们具有无界(实际上,它是 Short.Max)最大宽​​度,而所有其他都具有内容相关性max
  • BoxLayout 尊重最大尺寸,因此所有多余的部分都会在这三个尺寸之间分配

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

  • JSeparator 的首选项高度为 0
  • FlowLayout 为每个子级提供其首选项尺寸

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

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

The reason BoxLayout is adding those gaps is that

  • the width of your frame (panel) is greater than the total pref sizes of the children
  • JSeparator and JSlider have an unbounded (practically, it's Short.Max) max width while all others have a content dependent max
  • BoxLayout respects max sizes, so all excess gets distributed between those three

The reason FlowLayout doesn't show the separators at all,

  • JSeparator has a pref height of 0
  • FlowLayout gives every child its pref size

The easy way out is Howare's first suggestion: add the complete control to a panel with flowLayout. The more robust solution is to switch over to a more powerful LayoutManager :-)

(removed edit again, BorderLayout.south/north doesn't ;-)

一指流沙 2024-12-13 11:24:10

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

change BoxLayout to new FlowLayout(FlowLayout.LEFT). This should work. Unfortunately I do not have a real explanation why BoxLayout does not work for you.

梦醒灬来后我 2024-12-13 11:24:10

您可以将您的控件放入另一个带有FlowLayout的面板中。

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

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

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

You may put your control into another panel with a FlowLayout.

Update: Unfortunately setting the control to flowlayout directly via

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

does not work, since the separator's preferred height is zero and the separators will disappear.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文