【问题标题】:Component inside JMenuBar wants to align far right after JSeparator?JMenuBar 中的组件想要在 JSeparator 之后对齐很远?
【发布时间】:2015-08-10 19:39:53
【问题描述】:

看看这张图片:

如您所见,我的“自动刷新”JCheckBox 和“显示列”菜单之间有一个 JSeparator,我的“显示列”菜单希望尽可能靠右。为什么它不向左对齐,就像 JSeparator 之前的所有其他东西一样?而且我似乎无法做到,这是我当前的代码:

JCheckBox pulling = new JCheckBox("Auto Refreshing");
...
menuBar.add(pulling);

menuBar.add(new javax.swing.JSeparator(javax.swing.SwingConstants.VERTICAL));

JMenu showMenu = new JMenu("Show Column");
showMenu.setAlignmentX(Component.LEFT_ALIGNMENT);
menuBar.add(showMenu);

【问题讨论】:

  • JMenuBar 仅设计用于 JMenu 子级;添加 JMenu 以外的东西是自找麻烦。
  • 发布您的SSCCE 来证明问题。您之前曾被要求获得 SSCCE。在问题解决之前,您不知道代码的哪一部分是问题所在。我们没有时间不断询问更多信息,因此所有相关信息都应与问题一起发布,这样我们就不必猜测任何事情。
  • @camickr。抱歉,我确实提供了 SSCCE。你还想看什么?没有其他与该问题相关的内容。将此menuBar设置为JFrame的JMenuBar后通过setJMenuBar(...)
  • @danglingPointer,这不是 SSCCE。代码无法编译和执行。阅读链接。

标签: java swing jmenu jmenubar jseparator


【解决方案1】:

这个tutorial 可能会有所帮助。引用:

默认情况下,大多数组件都有中心 X 和 Y 对齐。但是,按钮、组合框、标签和菜单项具有不同的默认 X 对齐值:LEFT_ALIGNMENT。

因此您可以看到放置逻辑不同,换句话说,不要指望它。但是,我不知道为什么您的手动左对齐不起作用。最有可能的问题是您最后一个菜单的大小。你可以做的是使用glue as filler,因为JMenuBar 有一个BoxLayout

menuBar.add(showMenu);
menuBar.add(Box.createHorizontalGlue());

这个不可见的空间将被添加到菜单的末尾,并将其前面的组件向左推。

【讨论】:

  • 因此添加水平胶水将菜单稍微移动了一点,使其几乎居中。但是您的建议确实帮助我找到了解决方案,所以谢谢!
【解决方案2】:

问题在于 JSeparator 的大小,它想占用尽可能多的水平空间。所以,我的解决方案是限制它的大小,使其最大只能是一个像素宽:

JSeparator menuSep = new JSeparator(javax.swing.SwingConstants.VERTICAL);
menuSep.setMaximumSize(new java.awt.Dimension(1, 1000));
menuBar.add(menuSep);

【讨论】:

  • 如果发布了正确的 SSCCE,您本可以在 2 天前得到答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多