JavaFX 在关于组件的初始化之后设置 SplitPane 分隔符

JavaFX Setting SplitPane divider after init regarding components


我想将我的 SplitPane 分隔线设置为 "specific" 起始位置,这样,考虑到了 window.
的组成部分 有一个修复起始大小的 TableView,但 window 大小可能不同。所以我想在开始时设置分隔线位置,这样 table 就完全可见,分隔线就在它旁边。
到目前为止,我在 public void initialize():
中有以下代码
控制器:

 @FXML
SplitPane splitPane;

@FXML
TreeTableView treeTable;

public void initialize() {
    getStage().addEventHandler(WindowEvent.WINDOW_SHOWN, new EventHandler<WindowEvent>() {
        @Override
        public void handle(WindowEvent event) {
            double tableWidth = treeTable.getWidth();
            double stageWidth = getStage().getWidth();
            splitPane.setDividerPositions(tableWidth / stageWidth);
        }
    });
}


FXML:

<SplitPane fx:id="splitPane">
    <items>
        <TreeTableView fx:id="treeTable" prefWidth="280">
            <!-- table -->
        </TreeTableView>
        <AnchorPane fx:id="anchorPane">
            <!-- anchor pane -->
        </AnchorPane>
    </items>
</SplitPane>

但它不起作用,因为此时 Stage 为空。

所以问题是还没有加载所有内容,因此要解决此问题,您可以在 Main 启动函数的末尾调用它,如下所示

主要:

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        FXMLLoader loader = new FXMLLoader(getClass().getResource("/Sample.fxml"));
        Scene scene = new Scene(loader.load());

        primaryStage.setScene(scene);

        Controller controller = loader.getController();
        controller.setStartingPosition(primaryStage);

        primaryStage.show();
    }

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

控制器:

public class Controller {

    public SplitPane splitPane;
    public TreeTableView treeTable;
    public AnchorPane anchorPane;


    public void setStartingPosition(Stage stage){
        stage.addEventHandler(WindowEvent.WINDOW_SHOWN, new EventHandler<WindowEvent>() {
            @Override
            public void handle(WindowEvent event) {
                double tableWidth = treeTable.getWidth();
                double stageWidth = stage.getWidth();
                splitPane.setDividerPositions(tableWidth / stageWidth);
            }
        });
    }
}

我不知道这是否有效,因为我没有你所说的 "other components" 所以请告诉我这是否有效,对我来说两种方式看起来都一样