【问题标题】:JavaFX SplitPane Divider Position Inconsistent BehaviourJavaFX SplitPane 分隔符位置不一致的行为
【发布时间】:2013-02-23 14:03:09
【问题描述】:

我在 SplitPane (splitPane) 中显示了两个 StackPane (pane1 & pane2)。 SplitPane 的分隔线位置在构建器中设置为 .3。第二个 StackPane (pane2) 包含一个 Button,它还将 SplitPane 的分隔线位置设置为 .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();

【问题讨论】:

    标签: position javafx divider splitpane


    【解决方案1】:

    我对拆分窗格的位置有疑问,它似乎与您的相似。这里是:我有一个选项卡,每当我添加一个新选项卡时,我都会从一个 fxml 加载选项卡的内容,其中存在一个拆分窗格,分隔线位置固定为 0.8。

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

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

    正如我所说,我的问题与您的问题不完全相同,但似乎相似。所以我不确定,但希望我的解决方法能帮助你:在我的情况下,将setDividerPositions 调用放在Platform.runLater 中就可以了。

    【讨论】:

      【解决方案2】:

      感谢 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)。我想最终的解决方案是提供分隔线绝对定位的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-19
        • 1970-01-01
        • 1970-01-01
        • 2019-06-05
        • 2012-08-14
        • 2012-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多