2015-05-02 5 views
1

Я поместил прямоугольник в vbox при щелчке и печатаю координату прямоугольника. При нажатии клавиши я печатаю только координату. Посмотрите на этот пример кода, например:Когда Vbox/Hbox назначает координату для своих детей?

@FXML 
private VBox vbox; 

@FXML 
private AnchorPane anchorpane; 

private List<Rectangle> rectangles = new ArrayList<>(); 

@Override 
public void initialize(URL location, ResourceBundle resources) { 
    System.out.println("init"); 

} 

@FXML 
private void onMouseClick(MouseEvent e) { 
    System.out.println("click"); 
    vbox.getChildren().clear(); 

    for(int i = 0; i < 3 ; i++){ 
     Rectangle r = new Rectangle(100.0, 10.0, Color.BLACK); 
     r.addEventHandler(KeyEvent.ANY, this::onKeyTyped); 
     rectangles.add(r); 
     vbox.getChildren().add(r); 

     System.out.println(" r Yposition :" + r.getLayoutY() + " or " + r.getBoundsInParent().getMinY() + " or " + r.getBoundsInLocal().getMinY()); 
     System.out.println("Vbox height : " + vbox.getBoundsInLocal().getHeight()); 

    } 

} 

@FXML 
private void onKeyTyped(KeyEvent e) { 
    System.out.println("Key pressed"); 
    for (Rectangle r : rectangles){   
     System.out.println(" r Yposition :" + r.getLayoutY() + " or " + r.getBoundsInParent().getMinY() + " or " + r.getBoundsInLocal().getMinY()); 
     } 
    System.out.println("Vbox height : " + vbox.getBoundsInLocal().getHeight()); 
} 

Это дает мне следующий вывод:

click 
r Yposition :0.0 or 0.0 or 0.0 
Vbox height : 10.0 
r Yposition :0.0 or 0.0 or 0.0 
Vbox height : 10.0 
r Yposition :0.0 or 0.0 or 0.0 
Vbox height : 10.0 

Key pressed 
r Yposition :0.0 or 0.0 or 0.0 
r Yposition :10.0 or 10.0 or 0.0 
r Yposition :20.0 or 20.0 or 0.0 
Vbox height : 30.0 

Поэтому я полагаю, JavaFX назначить координаты формы, когда она выводит его на экран. Но как я могу получить координату формы в Vbox, когда я ее обновляю?

ответ

3

После того, как вы добавите прямоугольники в VBox, при вызове немедленно до getBoundsInParent() вы не получите результатов.

Причина этого может быть найдена here:

Layout и CSS также привязаны к импульсу события. Многочисленные изменения в графике сцены могут привести к нескольким макетам или обновлениям CSS, что может серьезно ухудшить производительность. Система автоматически выполняет передачу CSS и макета один раз за каждый импульс, чтобы избежать ухудшения производительности. Разработчики приложений также могут вручную запускать макеты прохода по мере необходимости для проведения измерений до импульса.

Так что, если вам действительно нужны границы этих прямоугольников в том же проходе, вы можете позвонить:

vbox.layout(); 

сразу после добавления каждого прямоугольника на поле, чтобы получить свою окончательную позицию.

Согласно Javadoc, layout():

Выполнение сверху вниз проход макета на графе сцены в соответствии с настоящим родителем. Вызов этого метода в то время как Родитель делает макет это нет-оп

И теперь это будет работать, как вы ожидали:

for(int i = 0; i < 3 ; i++){ 
    Rectangle r = new Rectangle(100.0, 10.0, Color.BLACK); 
    rectangles.add(r); 
    vbox.getChildren().add(r); 
    vbox.layout(); 

    System.out.println(" r Yposition :" + r.getLayoutY() + " or " + r.getBoundsInParent().getMinY() + " or " + r.getBoundsInLocal().getMinY()); 
    System.out.println("Vbox height : " + vbox.getBoundsInLocal().getHeight()); 
} 

В качестве альтернативы, вы можете переопределить метод layoutChildren() из vbox, как это вызывается при переходе макета к макету детей в этом родителе:

private VBox vbox=new VBox(){ 

    @Override 
    protected void layoutChildren() { 
     super.layoutChildren(); 
     for (Rectangle r : rectangles){   
      System.out.println(" r Yposition :" + r.getLayoutY() + " or " + r.getBoundsInParent().getMinY() + " or " + r.getBoundsInLocal().getMinY()); 
     } 
    } 

}; 

Это даст вам тот же результат. Обратите внимание, что это не будет работать с vbox, добавленным в файл FXML, так как вам нужно создать новый экземпляр.

+0

Thx вы это именно то, что я искал, но я не смог его найти. Извините за поздний ответ – user43968