2012-04-11 3 views
3

Я не могу понять, как получить ширину StackPane в:Получить StackPane-й ширин

Если я см http://docs.oracle.com/javafx/2.0/api/javafx/scene/layout/StackPane.html, размерности StackPane должны адаптироваться к его содержание:

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

Предпочтительная ширина вставки слева и справа плюс наибольшая ширина ширины для детей.

Синтаксис здесь Scala, но вопрос касается JavaFX:

import javafx.scene.layout.StackPane 
import javafx.scene.shape.Rectangle 

class Bubble() extends StackPane { 
val rect = new Rectangle(100, 100) 

getChildren.add(rect) 

println(rect.getWidth) 
println(this.getWidth) 
} 

Output : 
>> 100.0 
>> 0.0 <- Why isn't it 100 ? 

Является ли это ошибка или долгожданным поведение? Как я могу получить ширину содержимого StackPane?

Thanx

ответ

3

менеджеров компоновки (и фактически всех изменяемых объектов) не обновляют свои границы, пока приложение не будучи на самом деле показано на рисунке. Rectangle дает ширину 100, потому что это значение по умолчанию с вашим конструктором.

Смотреть следующий код:

@Override 
public void start(Stage stage) throws Exception { 
    StackPane root = new StackPane(); 
    Rectangle rect = new Rectangle(100, 100); 
    root.getChildren().add(rect); 

    // 100 - 0 
    System.out.println(rect.getWidth()); 
    System.out.println(root.getWidth()); 

    stage.setScene(new Scene(root)); 

    // 100 - 0 
    System.out.println(rect.getWidth()); 
    System.out.println(root.getWidth()); 

    stage.show(); 

    // 100 - 100 
    System.out.println(rect.getWidth()); 
    System.out.println(root.getWidth()); 
} 

Так что вам нужно либо ждать StackPane, чтобы показать. Или лучше полагаться на JavaFX по этому вопросу и использовать привязку. Например.

stage.titleProperty().bind(root.widthProperty().asString()); 
Смежные вопросы