2

我正在设计一个 JavaFX GUI,其中嵌入了多个拆分窗格。如果用户选择重置视图的选项,我希望能够将分隔线位置重置为其初始值。问题是用户必须多次单击重置视图选项才能完全重置分隔线位置。这样做一次会重置相同方向的分隔线,但不会重置相反方向的分隔线。

这是问题的一个例子。拖动滑块,然后单击窗口顶部的“重置视图”按钮:

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);
       }
    });
}

我尝试为每个滑块添加一个延迟计时器,这解决了问题,但感觉像是一个笨拙的解决方案。如果有更好的方法有什么想法吗?

4

1 回答 1

1

这对我有用。仍然有点笨拙的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 完成布局。我还尝试使用 Platform.runLater() 将分隔线定位命令放在事件队列中,如几个类似问题中所述,但这似乎不可靠。这在使用 JavaFX 8 的 Windows 上一直有效。

于 2015-03-06T16:30:37.707 回答