JavaFX在初始化有关组件后设置SplitPane分隔符

时间:2019-01-10 15:40:45

标签: java javafx javafx-8 javafx-2 splitpane


我想将我的SplitPane分隔符设置为“特定”的起始位置,以便考虑到窗口的组成部分。
有一个固定的Starter大小的TableView,但是窗口大小可以不同。因此,我想在开始时设置分隔线的位置,以便表格完全可见,并且在分隔线的旁边。
到目前为止,我在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为空。

1 个答案:

答案 0 :(得分:0)

所以问题是一切还没有加载,因此要解决此问题,您可以在Main start函数的末尾调用它,如下所示:

主要:

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);
            }
        });
    }
}

由于我没有您要说的“其他组件”,因此我无法确定它是否有效,因此请告诉我,如果这两种方法对我来说看起来都一样