【问题标题】:How to make a component fit parents width using BoxLayout?如何使用 BoxLayout 使组件适合父级宽度?
【发布时间】:2017-02-10 20:22:22
【问题描述】:

我有一个带有 BoxLayout Y 轴的 JPanel,并且想向这个面板添加多个 JLabel。标签应该适合面板的宽度,但只使用他们需要的高度。你们谁能帮帮我?

【问题讨论】:

  • 默认情况下BoxLayout 尊重组件的preferredSize,您应该使用另一种布局,例如GridLayout,或者将BoxLayout 的每一行包裹在FlowLayout 中。但是为了尽快获得更好的帮助,请张贴minimal reproducible example 以及您的实际和所需输出的图像或 ascii 艺术,以最小尺寸和可调整大小并使用额外空间。
  • 感谢您的回答。这是我使用 GridLayout 时的样子:prntscr.com/e74ftl,因为我不知道用户使用它时会有多少标签。这就是 BoxLayout 的外观:prntscr.com/e74gr0,但我希望标签与它们所在的面板一样,而不是像显示字符串所需的那样大。
  • @Frakcool, By default BoxLayout respects the preferredSize of the components, - 实际上在这种情况下 BoxLayout 尊重组件的最大尺寸。通常,当有额外空间时,BoxLayout 将允许组件增长。但是,JLabel 的首选大小和最大大小是相同的,因此标签永远不会增长到填满可用空间。
  • @camickr 是的,我读错了,对 JLabel 和 JTextField 感到困惑,但你是对的 :) 感谢您的澄清

标签: java swing layout-manager boxlayout


【解决方案1】:

如何使用 BoxLayout 使组件适合父级宽度?

BoxLayout 尊重组件的maximum size 大小。对于JLabel,首选尺寸和最大尺寸相同,因此标签不会变大。

因此,您可以覆盖每个 JLabel 的 getMaximumSize() 方法来执行以下操作:

return new Dimension(getPreferredSize().width, Integer.MAX_VALUE);

不过,更简单的方法是设置面板以提供所需的效果。

例如:

JPanel labelPanel = new JPanel( new GridLayout(0, 1) );
labelPanel.add(new JLabel( "one" ) );
labelPanel.add(new JLabel( "two" ) );

JPanel wrapper = new JPanel( new BorderLayout() );
wrapper.add(labelPanel, BorderLayout.PAGE_START);

frame.add(wrapper, BorderLayout.CENTER);

现在 labelPanel 将只取它需要的高度,但宽度会增长以填充框架的宽度,因此标签的宽度也会增长。

另一个不使用嵌套面板的选项是使用GridBagLayout。它支持fill 约束,允许每个组件调整大小以填充可用空间。

阅读 Layout Managers 上的 Swing 教程部分了解更多信息。

【讨论】:

  • 非常感谢!这个帮助了我。以前从未使用过 minimumSize 和 maximumSize 的组件。
猜你喜欢
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 2017-10-01
相关资源
最近更新 更多