JavaFX Настройка разделителя SplitPane после инициализации относительно компонентов - PullRequest
0 голосов
/ 10 января 2019


Я хочу установить разделитель SplitPane в «определенную» исходную позицию, чтобы он учитывал компоненты окна.
Существует фиксированный размер 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>

Но это не работает, потому что в данный момент сцена пуста.

1 Ответ

0 голосов
/ 10 января 2019

Таким образом, проблема в том, что все еще не загружено, поэтому, чтобы исправить это, вы можете вызвать его в конце вашей главной функции запуска, как показано ниже

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

Я не могу сказать, работает ли это, поскольку у меня нет «других компонентов», о которых вы говорите, поэтому дайте мне знать, если это работает, для меня это выглядит одинаково в обоих направлениях

...