JavaFX Pagination如何隐藏底部控制面板并让页面占用对应区域
解决方案
你的代码不生效主要是两个问题:
- 节点高度设置的方法调用错误:
minHeight()、prefHeight()、maxHeight()是获取对应属性值的方法,不是设置方法,需要用setMinHeight()、setPrefHeight()、setMaxHeight()才能修改属性。 - 你给天蓝色的pagePane写死了prefHeight为400,就算底部控件栏隐藏,页面区域也不会自动拉伸填充空白。
修改后的可运行代码
package javafxpagination; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Pagination; import javafx.scene.layout.Pane; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class TestPagination extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { primaryStage.setTitle("Test pagination"); Pagination pagination = new Pagination(); pagination.setPageCount(4); pagination.setMaxPageIndicatorCount(4); pagination.setCurrentPageIndex(0); pagination.setPageFactory((pageIndex) -> { Pane pagePane = new Pane(); pagePane.setPrefWidth(600); // 取消固定高度设置,让页面自动填充可用空间 pagePane.prefHeightProperty().bind(pagination.heightProperty().subtract(40)); pagePane.setStyle("-fx-background-color: #DDF1F8;"); //天蓝色 Button button = new Button("Hide/show page buttons"); button.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { Node paginationControl = pagination.lookup(".pagination-control"); if(paginationControl == null) return; boolean isNowVisible = !paginationControl.isVisible(); paginationControl.setVisible(isNowVisible); paginationControl.setManaged(isNowVisible); if(isNowVisible){ // 显示时恢复默认高度 paginationControl.setMaxHeight(Double.MAX_VALUE); paginationControl.setPrefHeight(-1); pagePane.prefHeightProperty().bind(pagination.heightProperty().subtract(40)); }else{ // 隐藏时高度设为0 paginationControl.setMinHeight(0); paginationControl.setPrefHeight(0); paginationControl.setMaxHeight(0); // 隐藏控件栏后页面直接占满整个Pagination高度 pagePane.prefHeightProperty().bind(pagination.heightProperty()); } // 触发Pagination重新布局 pagination.requestLayout(); } }); pagePane.getChildren().add(button); return pagePane; }); VBox vBox = new VBox(pagination); Scene scene = new Scene(vBox, 800, 600); primaryStage.setScene(scene); primaryStage.show(); } }
核心改动说明
- 修正了paginationControl高度设置的方法调用,隐藏时将最小/首选/最大高度全部设为0,彻底消除控件栏的占位
- 给pagePane的高度做了动态绑定:控件栏显示时,页面高度减去控件栏的默认高度(约40px);控件栏隐藏时,页面高度直接占满整个Pagination的高度
- 每次切换显隐后调用
pagination.requestLayout()主动触发布局刷新,确保修改立刻生效
内容的提问来源于stack exchange,提问作者Marogo
相关产品推荐
相关产品推荐

