JavaFx: отключить делитель
У меня есть приложение JavaFX с SplitPane. Я хочу отключить разделитель на SplitPane, чтобы было невозможно изменить его положение во время работы приложения. Как я могу это сделать?
4 ответа
Для этого нет API, поэтому, когда сцена показана, мы должны использовать функцию поиска, чтобы найти узел по его идентификатору. В этом случае Divider
имеет этот идентификатор: split-pane-divider
,
Как только мы находим узел, мы устанавливаем его прозрачным для событий мыши:
@Override
public void start(Stage primaryStage) {
final SplitPane splitPane = new SplitPane();
splitPane.setOrientation(Orientation.HORIZONTAL);
splitPane.setDividerPositions(new double[]{0.5});
splitPane.getItems().add(new StackPane(new Label("Left")));
splitPane.getItems().add(new StackPane(new Label("Right")));
Scene scene = new Scene(splitPane, 300, 250);
primaryStage.setScene(scene);
primaryStage.show();
splitPane.lookupAll(".split-pane-divider").stream()
.forEach(div -> div.setMouseTransparent(true) );
}
Ни один из вышеперечисленных постов не работал для меня. Я нашел это решение, которое сработало для меня: этот код работает для случая, когда ваша splitPane разделена посередине и имеет только один делитель, поэтому позиция делителя установлена на 0.5
, Если вы не знаете положение делителя, вы можете получить его по divider.getPosition();
,
Divider divider = splitPane.getDividers().get(0);
divider.positionProperty().addListener(new ChangeListener<Number>()
{
@Override
public void changed( ObservableValue<? extends Number> observable, Number oldvalue, Number newvalue )
{
divider.setPosition(0.5);
}
});
Этот код находится в initialize()
метод класса контроллера GUI.
Установите mouseTransparent="true" для SplitPane в файле Fxml.
<SplitPane dividerPositions="0.5" mouseTransparent="true" prefHeight="652.0" prefWidth="858.0">
Вы также можете изменить класс Skin для SplitPane. Просто скопируйте код из GrepCode для SplitPaneSkin (доступно здесь) и удалите MouseListeners в методе initializeDivderEventHandlers(), а также вызовы setCursor в методе setGrabberStyle(), и тогда вы не сможете изменить размер панели, перетаскивая разделитель;-) В конце вам нужно только установить скин для SplitPane, вызвав setSkin.