2014-09-22 5 views
2

Я разрабатываю графический интерфейс JavaFX, в котором есть несколько сплитпанов, встроенных внутри друг друга. Я хочу иметь возможность сбросить позиции разделителей до их начальных значений, если пользователь выбирает опцию для сброса представления. Проблема заключается в том, что пользователь должен несколько раз щелкнуть по опции просмотра сброса, чтобы полностью сбросить позиции разделителя. Выполнение его однажды сбрасывает разделители одной ориентации, но не разделители противоположной ориентации.JavaFX Splitpane Inside of Splitpane Set Divider Positions

Вот пример проблемы. Перетащите ползунки, а затем нажмите кнопку «Reset View» в верхней части окна:

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

Вот что сработало для меня. Еще вроде 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 для завершения компоновки. Я также попытался помещать команды позиционирования разделителя в очередь событий с Platform.runLater(), как упоминалось в нескольких похожих вопросах, но это казалось ненадежным. Это работает все время для меня в Windows с JavaFX 8.

+0

Честно говоря, это решение работает отлично, и это не похоже на kludgey. Я просто тестировал его на Linux с помощью JavaFX 8, и он работает намного лучше, чем мое первоначальное решение использовать таймеры для выполнения нескольких макетов. –

Смежные вопросы