JavaFX Настройка разделителя SplitPane после инициализации относительно компонентов
Я хочу установить разделитель 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 ответ
Таким образом, проблема в том, что все еще не загружено, поэтому, чтобы исправить это, вы можете вызвать его в конце вашей главной функции запуска, как показано ниже
Главный:
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);
}
});
}
}
Я не могу сказать, работает ли это, поскольку у меня нет "других компонентов", о которых вы говорите, поэтому дайте мне знать, если это работает, для меня это выглядит одинаково в обоих направлениях