JavaFX自定义节点布局

时间:2014-10-08 15:38:42

标签: layout javafx javafx-2 javafx-8

我正在开发一个应用程序,有必要在彼此之外(或在彼此之上等)布置节点。但是,此布局仅是初始放置,用户可以任意移动这些节点。如何在JavaFX中以正确的方式完成此操作?我将用一个简化的例子解释我的问题:

假设我有2个矩形,并希望将rect2放在rect1的右边。

// create first rectangle at position x= 5, y=5
rect1 = rectangle(5,5);
// create second rectangle to the right of rect1
rect2 = rectangle(5+rect1.width(), 5); 

在这种情况下,JavaFX尚未确定rect1的宽度,它将为零。直觉上,我会执行一个调用,让JavaFX绘制rect1,从而确定其宽度,然后添加rect2。请参阅以下示例:

// create first rectangle at position x= 5, y=5
rect1 = rectangle(5,5);
// let JavaFX draw rect1 (width will be calculated and set)
draw();
// create second rectangle to the right of rect1
rect2 = rectangle(5+rect1.width(), 5);

不幸的是,我还没有找到一种可以满足我想要的方法。我目前的解决方法是使用Platform.runLater(),但这不能始终正常工作。如果我对绑定的理解是正确的,那么绑定也不适合这个问题。我只想最初布局节点,所以我必须在初始布局后删除绑定(否则如果移动rect1,rect2将移动)。

提前感谢您的帮助。

编辑:这是一个最小的工作示例。按钮的宽度为0.我尝试调用root.layout()强制布局传递等但它似乎不起作用。

public class Test extends Application {

public static void main(String[] args) {
    launch(args);
}

@Override
public void start(Stage primaryStage) {
    Button btn = new Button();
    StackPane root = new StackPane();
    Scene scene = new Scene(root, 300, 250);
    primaryStage.setScene(scene);
    primaryStage.show();
    btn.setText("Say 'Hello World'");
    root.getChildren().add(btn);

    // prints out 0
    System.out.println(btn.getWidth());
}

}

1 个答案:

答案 0 :(得分:0)

鉴于上面的示例,如果我将舞台的场景设置为null然后重置它,则在调用System.out.println()时将正确设置按钮宽度。这似乎迫使整个舞台上的布局传递?然而,这似乎只是另一种解决方法,特别是我有性能问题。

@Override
public void start(Stage primaryStage) {
    Button btn = new Button();
    StackPane root = new StackPane();
    Scene scene = new Scene(root, 300, 250);
    primaryStage.setScene(scene);
    primaryStage.show();
    btn.setText("Say 'Hello World'");
    root.getChildren().add(btn);

    // reset scene
    primaryStage.setScene(null);
    primaryStage.setScene(scene);

    // prints out 107.0
    System.out.println(btn.getWidth());
}