JavaFX技术问题:如何让HBox中的Label占满全部水平宽度?
解决JavaFX中Label在HBox无法水平拉伸的问题
问题根源在于组件的默认尺寸限制:TextField的默认maxWidth是Double.MAX_VALUE,所以当HBox.hgrow设为ALWAYS时,它能自动拉伸填充可用空间;但Label的默认maxWidth等于自身的prefWidth(即文本内容的宽度),即便设置了HBox.hgrow="ALWAYS",它也不会突破自身的最大宽度限制。
不用设置超大的prefWidth,有两种更规范的解决方式:
方式一:在FXML中直接设置Label的maxWidth
给每个Label添加maxWidth="Infinity"属性(FXML中Infinity对应Java里的Double.MAX_VALUE),同时保留HBox.hgrow="ALWAYS":
<VBox prefHeight="375.0" prefWidth="640.0"> <HBox alignment="CENTER" VBox.vgrow="ALWAYS"> <TextField promptText="ichi" HBox.hgrow="ALWAYS" /> <TextField promptText="ni " HBox.hgrow="ALWAYS" /> <TextField promptText="san " HBox.hgrow="ALWAYS" /> </HBox> <HBox alignment="CENTER" VBox.vgrow="ALWAYS"> <Label text="eins" HBox.hgrow="ALWAYS" maxWidth="Infinity" /> <Label text="zwei" HBox.hgrow="ALWAYS" maxWidth="Infinity" /> <Label text="drei" HBox.hgrow="ALWAYS" maxWidth="Infinity" /> </HBox> </VBox>
方式二:用CSS统一配置
如果有多个需要拉伸的Label,用CSS统一设置更高效:
- 给目标Label添加样式类:
<Label text="eins" HBox.hgrow="ALWAYS" styleClass="stretch-label" /> <Label text="zwei" HBox.hgrow="ALWAYS" styleClass="stretch-label" /> <Label text="drei" HBox.hgrow="ALWAYS" styleClass="stretch-label" />
- 在CSS文件中添加规则:
.stretch-label { -fx-max-width: infinity; }
这样设置后,Label就会和TextField一样,自动均分HBox的水平宽度,完全符合需求。
内容的提问来源于stack exchange,提问作者Murkan Fusa
相关产品推荐
相关产品推荐

