显式定位窗格

Explicit positioning a Pane

我正在尝试使用 JavaFX 创建一个基本的 UML 图表工具。

首先我这样做了:

public class Asd extends Application {
    Double WINDOW_HEIGHT = (double) 400;
    Double WINDOW_WIDTH = (double) 800;
    Double RECTANGLE_DEFAULT_HEIGHT = (double) 50;
    Double RECTANGLE_DEFAULT_WIDTH = (double) 100;


    @Override
    public void start(Stage stage) throws Exception {
        final Pane root = new Pane();
        Rectangle background = new Rectangle(WINDOW_WIDTH, WINDOW_HEIGHT,
                Color.WHITE);
        root.getChildren().add(background);
        Scene scene = new Scene(root, WINDOW_WIDTH, WINDOW_HEIGHT);
        // On window click
        root.setOnMousePressed(new EventHandler<MouseEvent>() {
            public void handle(MouseEvent mouseEvent) {
                Rectangle rect = new Rectangle();
                rect.setX(mouseEvent.getX());
                rect.setY(mouseEvent.getY());
                rect.setWidth(RECTANGLE_DEFAULT_WIDTH);
                rect.setHeight(RECTANGLE_DEFAULT_HEIGHT);
                rect.setFill(null);
                rect.setStroke(Color.BLACK);
                root.getChildren().add(rect);
            }
        });
        stage.setScene(scene);
        stage.show();
    }

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

有了它,我可以在我单击的确切位置绘制一个矩形(表示 UML Class)。

现在我想添加文字。如果不是

root.getChildren().add(rect);

我愿意

Text text = new Text("mockText");
StackPane stackPane = new StackPane();
stackPane.getChildren().addAll(rect, text);
root.getChildren().add(stackPane);

文本位于矩形的中心,但所有矩形都位于坐标 (0,0)

那么,有什么办法可以改变每个 StackPane 的位置吗?或者不使用 StackPane 直接向矩形添加文本的任何替代方法?

好的,知道了。布局元素有方法 setLayoutX 和 setLayoutY 可以在这种情况下使用,所以我不再需要 Rectangle。setX/setY 最后 handle 方法应该是:

public void handle(MouseEvent mouseEvent) {
    Rectangle rect = new Rectangle();
    rect.setWidth(RECTANGLE_DEFAULT_WIDTH);
    rect.setHeight(RECTANGLE_DEFAULT_HEIGHT);
    rect.setFill(null);
    rect.setStroke(Color.BLACK);
    Text text = new Text("mockText");
    StackPane stackPane = new StackPane();
    stackPane.getChildren().addAll(rect, text);
    stackPane.setLayoutX(mouseEvent.getX());
    stackPane.setLayoutY(mouseEvent.getY());
    root.getChildren().add(stackPane);
}