JavaFX Splitpane内部的Splitpane设置分频器位置

时间:2014-09-22 18:30:00

标签: javafx divider splitpane

我正在设计一个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解决方案。如果有更好的方法,有什么想法吗?

1 个答案:

答案 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,我一直都在使用它。