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

Java 如何使用BoxLayout使组件适合父级宽度?,java,swing,layout-manager,boxlayout,Java,Swing,Layout Manager,Boxlayout,我有一个带有BoxLayout Y轴的JPanel,希望向该面板添加多个JLabel。标签应适合面板宽度,但仅使用所需的高度。你们中有人能帮我吗 如何使用BoxLayout使组件适合父级宽度 BoxLayout尊重组件的最大尺寸尺寸。对于JLabel标签,首选尺寸和最大尺寸相同,因此标签不会变大 因此,您可以覆盖每个JLabel的getMaximumSize()方法,以执行以下操作: return new Dimension(getPreferredSize().width, Integer.M

我有一个带有BoxLayout Y轴的JPanel,希望向该面板添加多个JLabel。标签应适合面板宽度,但仅使用所需的高度。你们中有人能帮我吗

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

BoxLayout尊重组件的
最大尺寸
尺寸。对于
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
约束,允许每个组件调整大小以填充可用空间

有关更多信息,请阅读上的Swing教程部分

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

BoxLayout尊重组件的
最大尺寸
尺寸。对于
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
约束,允许每个组件调整大小以填充可用空间


有关更多信息,请阅读上的Swing教程部分

默认情况下,
BoxLayout
尊重组件的
preferredSize
,您应该使用另一种布局,例如
GridLayout
,或者将
BoxLayout
的每一行包装在
FlowLayout
中。但是为了更快地获得更好的帮助,请以最小的尺寸发布一个和一个实际输出和所需输出的图像或ascii艺术,如果可以调整大小,请使用额外的空间。谢谢您的回答。这是我使用GridLayout:时的样子,因为我不知道用户使用它时会有多少标签。这就是BoxLayout:的外观,但我希望标签与它们所在的面板一样大,而不仅仅是显示字符串所需的大小。@Frakcool,
默认情况下,BoxLayout尊重组件的首选大小,
-实际上,在这种情况下,BoxLayout尊重组件的最大大小。通常,当有额外空间时,BoxLayout将允许组件增长。但是,JLabel的首选大小和最大大小是相同的,因此标签永远不会增长以填满可用空间。@camickr true,我读错了,并与
JLabel
JTextField
混淆,但是你是对的:)谢谢你澄清默认情况下
BoxLayout
尊重组件的
preferredSize
,你应该使用另一种布局,例如
GridLayout
,或者将
BoxLayout
的每一行包装在
FlowLayout
中。但是为了更快地获得更好的帮助,请以最小的尺寸发布一个和一个实际输出和所需输出的图像或ascii艺术,如果可以调整大小,请使用额外的空间。谢谢您的回答。这是我使用GridLayout:时的样子,因为我不知道用户使用它时会有多少标签。这就是BoxLayout:的外观,但我希望标签与它们所在的面板一样大,而不仅仅是显示字符串所需的大小。@Frakcool,
默认情况下,BoxLayout尊重组件的首选大小,
-实际上,在这种情况下,BoxLayout尊重组件的最大大小。通常,当有额外空间时,BoxLayout将允许组件增长。但是,JLabel的首选大小和最大大小是相同的,因此标签将永远不会增长以填满可用空间。@camickr true,我错读了,并被
JLabel
JTextField
弄糊涂了,但您是对的:)谢谢您的澄清,非常感谢!这个帮助了我。以前从未使用过最小尺寸和最大尺寸的组件。非常感谢!这个帮助了我。以前从未使用过组件的最小尺寸和最大尺寸。