Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set divider position of SplitPane

I want to set the divider of a SplitPane to a certain default position. This does not work, the divider stays in the middle:

public void start(Stage primaryStage) throws Exception{

    SplitPane splitPane = new SplitPane(new Pane(), new Pane());

    // Report changes to the divider position
    splitPane.getDividers().get(0).positionProperty().addListener(
            o -> System.out.println(splitPane.getDividerPositions()[0])
    );

    // Doesn't work:
    splitPane.setDividerPositions(0.8);

    // The docs seem to recommend the following (with floats instead of
    // doubles, and with one number more than there are dividers, which is
    // weird), but it doesn't work either:
    //splitPane.setDividerPositions(0.8f, 0.2f);

    primaryStage.setScene(new Scene(splitPane));
    primaryStage.setMaximized(true);
    primaryStage.show();
}

The output:

0.8
0.5

screenshot of result

It suggests that something resets it to the middle.

How can I achieve this?

like image 790
Midgard Avatar asked Mar 29 '16 16:03

Midgard


2 Answers

As pointed out by others the issue is that the divider position is reset when the Stage is maximized.

You can prevent this by setting ResizableWithParent to false.

Example

Let's say you have a SplitPane with two nested containers inside. Here is the fxml extract:

<SplitPane fx:id="splitPane" dividerPositions="0.25">
        <VBox fx:id="leftSplitPaneContainer" />
        <FlowPane fx:id="rightSplitPaneContainer"/>
</SplitPane>

And here is the extract from the controller class:

@FXML
private SplitPane splitPane;
@FXML
private VBox leftSplitPaneContainer;
@FXML
private FlowPane rightSplitPaneContainer;

Then you simply can call SplitPane.setResizableWithParent() on both containers to prevent resetting the divider position:

public void initialize(){
        SplitPane.setResizableWithParent(leftSplitPaneContainer, false);
        SplitPane.setResizableWithParent(rightSplitPaneContainer, false);
    }

The divider position will now remain at 0.25 even if you maximize the window.

No complicated listeners or overwriting of SplitPaneSkin involved.

like image 58
Florian Avatar answered Oct 13 '22 06:10

Florian


The issue seems to be that the divider position is reset when the SplitPane width is set during when the Stage is maximized. Set the divider positions afterwards by listening to the window's showing property as follows:

primaryStage.showingProperty().addListener(new ChangeListener<Boolean>() {

    @Override
    public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
        if (newValue) {
            splitPane.setDividerPositions(0.8);
            observable.removeListener(this);
        }
    }
});
like image 43
fabian Avatar answered Oct 13 '22 06:10

fabian