我正在设计一个JavaFX GUI,其中有多个splitpanes嵌入在彼此内部。如果用户选择重置视图的选项,我希望能够将分隔符位置重置回其初始值。问题是用户必须多次单击重置视图选项才能完全重置分隔符位置。这样做一次就会重置相同方向的分隔线,而不是相反方向的分隔线。
以下是问题的一个示例。拖动滑块,然后单击窗口顶部的“重置视图”按钮:
public void start(Stage stage) throws Exception
{
SplitPane mainWindow = new SplitPane();
SplitPane leftPanel = new SplitPane();
SplitPane rightPanel = new SplitPane();
Button resetViewButton = new Button("Reset View");
VBox mainFrameVBox = new VBox();
Scene scene = new Scene(mainFrameVBox, 500, 500);
mainWindow.setOrientation(Orientation.HORIZONTAL);
mainWindow.getItems().addAll(leftPanel, rightPanel);
mainWindow.setDividerPosition(0, 0.125);
leftPanel.setOrientation(Orientation.VERTICAL);
leftPanel.getItems().addAll(new VBox(new Text("Test 1")), new VBox(new Text("Test 2")));
leftPanel.setDividerPosition(0, 0.5);
rightPanel.setOrientation(Orientation.VERTICAL);
rightPanel.getItems().addAll(new VBox(new Text("Test 3")), new VBox(new Text("Test 4")));
rightPanel.setDividerPosition(0, 0.85);
mainFrameVBox.getChildren().addAll(resetViewButton, mainWindow);
VBox.setVgrow(mainWindow, Priority.ALWAYS);
stage.setScene(scene);
stage.show();
resetViewButton.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent event)
{
mainWindow.setDividerPosition(0, 0.125);
leftPanel.setDividerPosition(0, 0.5);
rightPanel.setDividerPosition(0, 0.85);
}
});
}
我尝试为每个滑块添加一个延迟计时器,这可以解决问题,但感觉就像一个kludgey解决方案。如果有更好的方法,有什么想法吗?
答案 0 :(得分:1)
这对我有用。仍然是一种kludgey IMO。
resetViewButton.setOnAction((ActionEvent event) -> {
mainWindow.setDividerPosition(0, 0.125);
leftPanel.setDividerPosition(0, 0.5);
leftPanel.layout();
rightPanel.setDividerPosition(0, 0.85);
rightPanel.layout();
});
似乎需要多次传递才能使嵌入式SplitPanes完成布局。我也尝试将divider定位命令与Platform.runLater()一起放在事件中,如同一些类似问题所述,但这似乎不可靠。对于使用JavaFX 8的Windows,我一直都在使用它。