JavaFX子容器最大化无法占满可用空间问题求助
解决JavaFX子容器无法填充BorderPane中心区域的问题
问题根源
你的子容器GridPane设置了maxHeight="-Infinity"和maxWidth="-Infinity",这会强制它只能保持预设的prefHeight和prefWidth,无法随父容器的大小变化扩展。同时GridPane的列、行约束以及内部TableView的尺寸配置也需要调整,才能充分利用可用空间。
修改步骤
1. 修正子容器GridPane的尺寸约束
移除maxHeight="-Infinity"和maxWidth="-Infinity"(JavaFX容器默认最大尺寸为无限大),或显式设置为允许无限扩展:
<!-- 替换原GridPane开头标签 --> <GridPane minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="500.0" xmlns="http://javafx.com/javafx/20.0.1" xmlns:fx="http://javafx.com/fxml/1">
2. 优化GridPane的布局约束
- 将列约束的
hgrow改为ALWAYS,让列自动填充宽度 - 将TableView所在行的
vgrow改为ALWAYS,让行自动填充高度
<columnConstraints> <ColumnConstraints hgrow="ALWAYS" minWidth="10.0" prefWidth="100.0" /> </columnConstraints> <rowConstraints> <RowConstraints maxHeight="264.00000915527346" minHeight="10.0" prefHeight="113.20000610351562" vgrow="SOMETIMES" /> <RowConstraints maxHeight="225.00000610351563" minHeight="10.0" prefHeight="36.79998779296875" vgrow="SOMETIMES" /> <!-- 修改此行的vgrow为ALWAYS --> <RowConstraints maxHeight="183.60001525878909" minHeight="22.39996337890625" prefHeight="136.00001220703123" vgrow="ALWAYS" /> <RowConstraints maxHeight="124.00002441406252" minHeight="10.0" prefHeight="113.60000000000002" vgrow="SOMETIMES" /> </rowConstraints>
3. 调整TableView的尺寸配置
移除TableView的固定prefHeight和prefWidth,设置其允许无限扩展:
<TableView maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" GridPane.rowIndex="2">
4. 控制器加载逻辑确认
确保加载子容器时直接将其设置为BorderPane的中心节点,无需额外固定尺寸:
public void getHome(ActionEvent event) throws IOException { FXMLLoader loader = new FXMLLoader(getClass().getResource("home.fxml")); GridPane homePane = loader.load(); borderPane.setCenter(homePane); }
修改后的完整子容器代码
<GridPane minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="500.0" xmlns="http://javafx.com/javafx/20.0.1" xmlns:fx="http://javafx.com/fxml/1"> <columnConstraints> <ColumnConstraints hgrow="ALWAYS" minWidth="10.0" prefWidth="100.0" /> </columnConstraints> <rowConstraints> <RowConstraints maxHeight="264.00000915527346" minHeight="10.0" prefHeight="113.20000610351562" vgrow="SOMETIMES" /> <RowConstraints maxHeight="225.00000610351563" minHeight="10.0" prefHeight="36.79998779296875" vgrow="SOMETIMES" /> <RowConstraints maxHeight="183.60001525878909" minHeight="22.39996337890625" prefHeight="136.00001220703123" vgrow="ALWAYS" /> <RowConstraints maxHeight="124.00002441406252" minHeight="10.0" prefHeight="113.60000000000002" vgrow="SOMETIMES" /> </rowConstraints> <children> <TableView maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" GridPane.rowIndex="2"> <columns> <TableColumn maxWidth="42.0" prefWidth="42.0" resizable="false" text="Sr.No" /> <TableColumn prefWidth="85.5999755859375" text="HSN/SAC" /> <TableColumn prefWidth="75.0" text="pID" /> <TableColumn prefWidth="75.0" text="ProductName" /> <TableColumn prefWidth="75.0" text="Wt/Ps" /> <TableColumn prefWidth="75.0" text="Qty" /> <TableColumn prefWidth="75.0" text="Rate" /> <TableColumn prefWidth="75.0" text="TaxableAmt" /> <TableColumn prefWidth="75.0" text="GST"> <columns> <TableColumn maxWidth="40.0" minWidth="40.0" prefWidth="40.0" resizable="false" text="%" /> <TableColumn prefWidth="75.0" text="Amt" /> </columns> </TableColumn> <TableColumn prefWidth="75.0" text="Total" /> </columns> <columnResizePolicy> <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" /> </columnResizePolicy> </TableView> </children> </GridPane>
额外说明
主容器中的BorderPane已经通过AnchorPane.bottomAnchor="0.0"等属性正确锚定,能随窗口大小变化,只要子容器的尺寸约束调整正确,就能自动填充BorderPane的中心区域。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

