如何使JavaFX GridPane中某列的所有元素宽度一致?
解决GridPane列内按钮宽度统一的问题
这里提供几种实用的方案来实现GridPane第0列所有按钮宽度一致的效果:
方法一:列约束+按钮填充列宽
给GridPane的第0列设置统一宽度约束,同时让按钮填充整个列的宽度,这是最常用的实现方式:
public class Tester extends Application { private static final int WIDTH = 300; private static final int HEIGHT = 400; @Override public void start(Stage stage) { GridPane pane = new GridPane(); pane.setAlignment(Pos.TOP_LEFT); pane.setHgap(10); pane.setVgap(10); pane.setPadding(new Insets(10, 10, 10, 10)); // 配置第0列的宽度规则 ColumnConstraints colConstraints = new ColumnConstraints(); colConstraints.setPrefWidth(180); // 自定义列的首选宽度,可按需调整 colConstraints.setHgrow(Priority.ALWAYS); // 可选:允许列随窗口拉伸 pane.getColumnConstraints().add(colConstraints); // 创建按钮并设置填充列宽 Button btnCat = new Button("cat"); btnCat.setMaxWidth(Double.MAX_VALUE); pane.add(btnCat, 0, 0); Button btnMonkey = new Button("monkey"); btnMonkey.setMaxWidth(Double.MAX_VALUE); pane.add(btnMonkey, 0, 1); Button btnAnimals = new Button("elephant and lion"); btnAnimals.setMaxWidth(Double.MAX_VALUE); pane.add(btnAnimals, 0, 2); Scene scene = new Scene(pane, WIDTH, HEIGHT); stage.setScene(scene); stage.show(); } }
方法二:绑定按钮宽度到最宽按钮
让所有按钮的宽度自动匹配列内最宽按钮的宽度,无需手动设置列宽:
public class Tester extends Application { private static final int WIDTH = 300; private static final int HEIGHT = 400; @Override public void start(Stage stage) { GridPane pane = new GridPane(); pane.setAlignment(Pos.TOP_LEFT); pane.setHgap(10); pane.setVgap(10); pane.setPadding(new Insets(10, 10, 10, 10)); Button btnCat = new Button("cat"); Button btnMonkey = new Button("monkey"); Button btnAnimals = new Button("elephant and lion"); // 绑定所有按钮的首选宽度到最宽按钮的宽度 btnCat.prefWidthProperty().bind(Bindings.max(btnMonkey.prefWidthProperty(), btnAnimals.prefWidthProperty())); btnMonkey.prefWidthProperty().bind(btnCat.prefWidthProperty()); btnAnimals.prefWidthProperty().bind(btnCat.prefWidthProperty()); pane.add(btnCat, 0, 0); pane.add(btnMonkey, 0, 1); pane.add(btnAnimals, 0, 2); Scene scene = new Scene(pane, WIDTH, HEIGHT); stage.setScene(scene); stage.show(); } }
方法三:统一设置按钮最小宽度
先获取列内最宽按钮的首选宽度,再把所有按钮的最小宽度设为这个值:
public class Tester extends Application { private static final int WIDTH = 300; private static final int HEIGHT = 400; @Override public void start(Stage stage) { GridPane pane = new GridPane(); pane.setAlignment(Pos.TOP_LEFT); pane.setHgap(10); pane.setVgap(10); pane.setPadding(new Insets(10, 10, 10, 10)); Button btnCat = new Button("cat"); Button btnMonkey = new Button("monkey"); Button btnAnimals = new Button("elephant and lion"); // 强制按钮计算自身首选宽度 btnCat.applyCss(); btnMonkey.applyCss(); btnAnimals.applyCss(); // 找出最宽按钮的宽度 double maxBtnWidth = Math.max(Math.max(btnCat.getPrefWidth(), btnMonkey.getPrefWidth()), btnAnimals.getPrefWidth()); // 统一设置所有按钮的最小宽度 btnCat.setMinWidth(maxBtnWidth); btnMonkey.setMinWidth(maxBtnWidth); btnAnimals.setMinWidth(maxBtnWidth); pane.add(btnCat, 0, 0); pane.add(btnMonkey, 0, 1); pane.add(btnAnimals, 0, 2); Scene scene = new Scene(pane, WIDTH, HEIGHT); stage.setScene(scene); stage.show(); } }
关于VBox方案未生效的原因
你之前尝试用VBox包裹按钮后加入GridPane没生效,大概率是两个问题:
- 没设置按钮填充VBox的宽度
- 没给VBox设置GridPane的行跨度,导致VBox只占一行空间
修正后的VBox方案代码:
public class Tester extends Application { private static final int WIDTH = 300; private static final int HEIGHT = 400; @Override public void start(Stage stage) { GridPane pane = new GridPane(); pane.setAlignment(Pos.TOP_LEFT); pane.setHgap(10); pane.setVgap(10); pane.setPadding(new Insets(10, 10, 10, 10)); VBox vbox = new VBox(10); // 间距和GridPane的vgap保持一致 Button btnCat = new Button("cat"); btnCat.setMaxWidth(Double.MAX_VALUE); // 按钮填充VBox宽度 Button btnMonkey = new Button("monkey"); btnMonkey.setMaxWidth(Double.MAX_VALUE); Button btnAnimals = new Button("elephant and lion"); btnAnimals.setMaxWidth(Double.MAX_VALUE); vbox.getChildren().addAll(btnCat, btnMonkey, btnAnimals); pane.add(vbox, 0, 0); GridPane.setRowSpan(vbox, 3); // 设置VBox跨越3行,匹配按钮数量 Scene scene = new Scene(pane, WIDTH, HEIGHT); stage.setScene(scene); stage.show(); } }
内容的提问来源于stack exchange,提问作者parsecer
相关产品推荐
相关产品推荐

