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.

Другие вопросы по тегам