JavaFX SplitPane 分隔条位置不一致的行为

3
我有两个StackPanes(pane1和pane2)在SplitPane(splitPane)中显示。 SplitPane的分隔符位置在构建器中设置为0.3。第二个StackPane(pane2)包含一个按钮,该按钮还将SplitPane的分隔符位置设置为0.3。
其他条件不变,预期行为应该是两个操作(在构建器中设置分隔符位置和通过操作设置分隔符位置)都能够正常工作或者都不能正常工作。
然而,只有后者实际上有效。
在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个回答

6
我遇到了一个关于分割窗格位置的问题,看起来与你的类似。具体情况如下:我有一个选项卡面板,每当我添加一个新选项卡时,我会从一个fxml文件中加载选项卡的内容,在这个fxml文件中存在一个分割窗格,分隔条位置被固定在0.8。
当第一个选项卡被加载时,它是正常的,分隔条的位置是0.8。当我通过fxml以完全相同的方式添加第二个选项卡时,第二个选项卡中的分割窗格位置为0.5,即默认值。
我尝试在加载选项卡内容后使用setDividerPositions方法编程设置分隔条位置,但它没有起作用。然后像你的情况一样,如果我将setDividerPositions调用放在一个onAction方法中,它就可以成功设置分隔条位置。
正如我所说,我的问题并不完全与你的相同,但看起来很相似。因此,我不确定但希望我的解决方法能够帮助你:在我的情况下,将setDividerPositions调用放在Platform.runLater中就可以解决问题。

6
所以,感谢Oracle支持论坛中的James D,这是完整答案:
“问题似乎是场景的大小小于其窗口。当窗口首次显示时,这会导致额外的布局传递;第二个布局传递算作“窗口调整大小”,因此分割窗格的分隔符位置在此传递中未被尊重。”
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(...)中设置分隔符位置。

后续处理

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接