Phi*_*l C 2 position javafx divider splitpane
我有两个 StackPanes(pane1 和 pane2)显示在 SplitPane (splitPane) 中。SplitPane 的分隔线位置在构建器中设置为 0.3。第二个 StackPane (pane2) 包含一个 Button,它也将 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();
Run Code Online (Sandbox Code Playgroud)
我在拆分窗格的位置方面遇到了问题,看起来与您的类似。这是:我有一个选项卡,每当我添加一个新选项卡时,我都会从 fxml 加载选项卡的内容,其中存在一个拆分窗格,分隔符位置固定为 0.8。
加载第一个选项卡时,就可以了,分隔符位于 0.8。当我添加第二个选项卡时,与通过fxml的第一个选项卡完全相同,第二个选项卡中拆分窗格的位置为0.5,即默认值。
setDividerPositions加载选项卡的内容后,我尝试使用方法以编程方式设置分隔线位置,但没有奏效。然后在你的情况下,如果我将setDividerPositions调用放在 onAction 方法中,它会成功设置分隔符位置。
正如我所说,我的问题与您的不完全相同,但似乎相似。所以我不确定,但希望我的解决办法能帮助你:在我的情况下,setDividerPositions拨打电话就Platform.runLater成功了。
感谢 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();
Run Code Online (Sandbox Code Playgroud)
解决方法2
正如 Ramazan 正确指出的那样,另一个解决方案是将分隔线位置设置为Platform.runLater(...)。
后续行动
我已在 jira (http://javafx-jira.kenai.com/browse/RT-28607)提交了一个错误,引用了原始错误报告(http://javafx-jira.kenai.com/browse/RT-17229 ) )已被标记为“无法解析”。我想最终的解决方案是提供分隔线绝对定位的方法。
| 归档时间: |
|
| 查看次数: |
6481 次 |
| 最近记录: |