11

如何实现整个 SplitPane 的按比例调整大小?

public class JfxSplitPaneTest extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        SplitPane split = new SplitPane();
        StackPane child1 = new StackPane();
        child1.setStyle("-fx-background-color: #0000AA;");
        StackPane child2 = new StackPane();
        child2.setStyle("-fx-background-color: #00AA00;");
        StackPane child3 = new StackPane();
        child3.setStyle("-fx-background-color: #AA0000;");
        split.getItems().addAll(child1, child2, child3);
        //split.setDividerPositions(0.1f, 0.6f, 0.9f)
        stage.setScene(new Scene(split, 400, 300));
        stage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}

启动程序:

在此处输入图像描述

设置我喜欢的分隔线:

在此处输入图像描述

使窗口宽度非常小(我继续并将其做得更小,没有图片):

在此处输入图像描述

重新调整大小并观察分隔线既不是我设置它们的方式,也不是程序启动时的方式。

在此处输入图像描述

这样做使它更接近我的期望:

    child1.setMinWidth(Region.USE_PREF_SIZE)
    child1.setPrefWidth(100)
    child2.setMinWidth(Region.USE_PREF_SIZE)
    child2.setPrefWidth(200)
    child3.setMinWidth(Region.USE_PREF_SIZE)
    child3.setPrefWidth(300)

除了分隔线最初位于错误的位置(直到我调整 SplitPane 的大小,1px 就足够了)并且在缩小窗口宽度时,分隔线位于组件内部。

请问我怎样才能使这项工作?

4

3 回答 3

4

尝试像 AS3Boyan 所说的那样设置除数

split.setDividerPositions(0.1f, 0.6f, 0.9f)

并添加:

当窗口调整大小时,如何避免 SplitPane 调整其中一个窗格的大小?

于 2017-11-20T23:18:37.880 回答
2

尝试将 Change Listener 添加到stage.widthProperty()stage.heightProperty()。并称之为:

    split.setDividerPositions(0.1f, 0.6f, 0.9f)
于 2013-09-27T11:34:11.730 回答
0

经验法则是在触发调整大小事件时使用setDividerPositionswith 。Platform.runLater

您可能希望从默认比率开始,让用户更改该比率,并在发生调整大小事件时保持该比率。splitPane让我们考虑一些25/75 垂直 FX stage

splitPane.setDividerPositions(0.25f, 0.75f);
stage.heightProperty().addListener((obs, oldVal, newVal) -> {
    double[] positions = splitPane.getDividerPositions(); // reccord the current ratio
    Platform.runLater(() -> splitPane.setDividerPositions(positions)); // apply the now former ratio
});
于 2018-03-14T12:27:33.143 回答