JavaFX SplitPane分隔符位置不一致行为

时间:2013-02-23 14:03:10

标签: position javafx divider splitpane

我在SplitPane(splitPane)中显示了两个StackPanes(pane1& pane2)。 SplitPane的分隔符位置在构建器中设置为.3。 Seond StackPane(pane2)包含一个Button,它还将SplitPane的分隔符位置设置为.3。

Ceteris条件不变,预期的行为是两个动作(在构建器中设置分隔符位置以及通过动作设置分隔符位置)是否有效。

然而,只有后者确实有效。

SplitPane的构造和Button的onAction之间有什么变化。什么阻碍了分隔器在建造者中的位置?

    StackPane pane1 = new StackPane();
    StackPane pane2 = new StackPane();

    final SplitPane splitPane = SplitPaneBuilder.create()
            .items(pane1, pane2)
            // Environment A
            .dividerPositions(new double[] {.3}) // splitPane.setDividerPosition(s)(...), etc. yield same result 
            .orientation(Orientation.HORIZONTAL)
            .build();

    // The following line influences environment A outcome, though it does not fix the issue
    SplitPane.setResizableWithParent(pane1, false);

    pane2.getChildren().add(ButtonBuilder.create()
            .text("Divider Position")
            .onAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    // Environment B
                    splitPane.setDividerPositions(.3);
                }
            })
            .build());

    Scene primaryScene = SceneBuilder.create()
            .root(splitPane)
            .build();

    primaryStage.setScene(primaryScene);
    primaryStage.setTitle("Name");
    primaryStage.setWidth(500);
    primaryStage.setHeight(500);
    primaryStage.show();

2 个答案:

答案 0 :(得分:4)

我对拆分窗格的位置有疑问,看起来和你的相似。这是:我有一个tabpane,每当我添加一个新标签时,我从fxml加载标签的内容,其中存在一个分割窗格,分隔符位置固定为0.8。

加载第一个标签时,分隔线位于0.8。当我添加第二个选项卡时,与第一个选项卡通过fxml完全相同,第二个选项卡中分割窗格的位置为0.5,即默认值。

我尝试在加载选项卡的内容后以setDividerPositions方法以编程方式设置分隔符位置,但它不起作用。然后就像你的情况一样,如果我将setDividerPositions调用放在onAction方法中,它会成功设置分隔符位置。

正如我所说,我的问题与你的问题不完全相同,但似乎相似。所以我不确定,但希望我的工作可以帮到你:在我的情况下,将setDividerPositions电话放在Platform.runLater就行了。

答案 1 :(得分:4)

所以,感谢James D在Oracle支持论坛中,这里有完整的答案:

“问题似乎是场景的大小小于其窗口的大小。这会在首次显示窗口时导致额外的布局传递;第二个布局传递计为”窗口调整大小“,从而计算分隔符位置在此通行证中不会遵守拆分窗格。“ (https://forums.oracle.com/forums/thread.jspa?threadID=2503701

解决方法1

设置Scene的大小而不是Stage的大小:

Scene primaryScene = SceneBuilder.create()
        .root(splitPane)
        .width(500)
        .height(500)
        .build();

primaryStage.setScene(primaryScene);
primaryStage.setTitle("Name");
primaryStage.show();

解决方法2

正如Ramazan正确指出的那样,另一种解决方案是在Platform.runLater(...)中设置分隔符位置。

<强> Followups

我已经在jira(http://javafx-jira.kenai.com/browse/RT-28607)提交了一个错误,引用了标记为“无法解析”的原始错误报告(http://javafx-jira.kenai.com/browse/RT-17229)。我想最终的解决方案是提供分隔器绝对定位的方法。