如何使 BorderPane 的 GridPane 权限可关闭?

问题描述

我有以下形式的代码

<borderpane>   
... 
<right>
    <GridPane>
        ...
    </GridPane>
</right>
...
</borderpane>

显然,现在 GridPane 在我的 borderpane 右侧占据了很大的空间。我想要做的是添加一个按钮(或其他元素)来最小化和最大化 GridPane,因此它只有在真正需要时才完全在用户的视野中。我怎样才能轻松实现这一目标?

解决方法

您可以通过关闭和打开 GridPane 的 Visible 和 Managed 属性来执行您想要的操作。 BorderPane 的中心将自动扩展以占据 BorderPane 的整个宽度。 “Managed”控制布局管理器是否会为节点留出空间,因此如果您只是关闭 Visible,那么您将在右侧拥有一个与 GridPane 大小相同的未使用区域。下面的代码演示了它,我把按钮放在一个 VBox 中,周围有边框,这样你就可以看到它是如何展开的:

public class ResizeRight extends BorderPane {

    public ResizeRight() {
        Button openButton = new Button("Open");
        Button closeButton = new Button("Close");
        GridPane gridPane = new GridPane();
        gridPane.addRow(0,new Text("This is just some text"));
        gridPane.addRow(1,new Text("This is just some more text"));
        VBox vbox = new VBox(10,openButton,closeButton);
        vbox.setBorder(new Border(new BorderStroke(Color.BLACK,BorderStrokeStyle.SOLID,CornerRadii.EMPTY,BorderWidths.DEFAULT)));
        setCenter(vbox);
        setRight(gridPane);
        setPadding(new Insets(10));
        openButton.setOnAction(evt -> {
            gridPane.setVisible(true);
            gridPane.setManaged(true);
        });
        closeButton.setOnAction(evt -> {
            gridPane.setVisible(false);
            gridPane.setManaged(false);
        });
    }
}

从以下内容运行它:

public class Sample1 extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        Scene scene = new Scene(new ResizeRight(),300,200);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}