mirzak
mirzak

Reputation: 1047

JavaFx : Disable Divider

I have a JavaFX application with a SplitPane. I want to disable the Divider on SplitPane, so it would not be possible to change its position when application is running. How can I do this?

Upvotes: 9

Views: 13854

Answers (4)

Dom
Dom

Reputation: 1457

None of the above posts worked for me. I have found this solution which worked for me: This code works for the case when your splitPane is divided in the middle and has only one divider, therefore the divider's position is set to 0.5. If you don't know the position of the divider, you can get it by 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);
        }
    }); 

This code is in the initialize() method of the GUI Controller class.

Upvotes: 5

Kaliappan
Kaliappan

Reputation: 660

Set mouseTransparent="true" of SplitPane in Fxml file.

<SplitPane dividerPositions="0.5" mouseTransparent="true" prefHeight="652.0" prefWidth="858.0">

Upvotes: 1

Strassenrenner
Strassenrenner

Reputation: 308

You can also modify the Skin class for SplitPane. Just copy the code from GrepCode for SplitPaneSkin (available here) and remove the MouseListeners in method initializeDivderEventHandlers() and also the setCursor calls in method setGrabberStyle() and then you can't resize the pane by dragging the divider ;-) At the end you only have to set the skin to the SplitPane by calling setSkin.

Upvotes: 0

Jos&#233; Pereda
Jos&#233; Pereda

Reputation: 45456

There's no API for that, so once the scene is shown we have to use a lookup function to find the node by its id. In this case, the Divider has this id: split-pane-divider.

Once we find the node, we set it transparent to mouse events:

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

}

Upvotes: 9

Related Questions