FluffyPal
FluffyPal

Reputation: 41

JavaFX: Coordinates of nodes are wrong for no obvious reason

I'm trying to visualize a graph in JavaFX. The nodes shall be interactive. At the moment I have a VBox and place as many HBoxes into it as I need levels in my graph. All the HBoxes are set to position their childrens centered. The childrens represent the individual nodes and are Buttons. The VBox itself is placed in a StackPane with a Canvas as another children of the StackPane. This StackPane is then placed into the Scene. I want to use the Canvas to draw the joining Edges between the nodes. To get The coordinates of the nodes i use:

System.out.println(button.localToScene(button.getBoundsInLocal().getMinX(),
button.getBoundsInLocal().getMinY()));

But no matter where the button is positioned, the resulting coordinate remains:

Point2D [x = 0.0, y = 108.0]

for all the buttons. Every single Button has apparently the same coordinate though it's displayed correctly!

Please help me, im quite desperate right now...

Edit:

Here is the minimal example that works:

Main.java

public class Main extends Application {

@Override
public void start(Stage primaryStage) throws Exception {
    VBox root = new VBox();
    HBox buttons = new HBox();
    TabPane tabs = new TabPane();
    buttons.getChildren().addAll(
            new Button("1"),
            new Button("2"),
            new Button("3"));
    tabs.getTabs().addAll(
            new TabBoxes("____A____"),
            new TabBoxes("____B____"),
            new TabBoxes("____C____")
    );
    root.getChildren().addAll(buttons, tabs);
    primaryStage.setScene(new Scene(root, 500, 400));
    primaryStage.show();
}


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

TabBoxes.java

public class TabBoxes extends Tab {
private VBox vBox = new VBox();
private ArrayList<HBox> hBoxes;
private Canvas canvas = new Canvas();
private StackPane stack = new StackPane();
private static final int V_INIT_SPACING = 60;
private static final int V_SPACING = 60;
private static final int H_SPACING = 60;

TabBoxes(String s){
    super(s);
    this.setContent(stack);
    setClosable(false);
    stack.getChildren().add(canvas);
    stack.getChildren().add(vBox);
    canvas.setWidth(2000);
    canvas.setHeight(1080);
    hBoxes = new ArrayList<>();
    vBox.setSpacing(V_SPACING);
    vBox.translateYProperty().set(V_INIT_SPACING);
    for (int i = 0; i < 5; i++) {
        hBoxes.add(new HBox() {
            {
                setSpacing(H_SPACING);
                setAlignment(Pos.CENTER);
            }
        });
    }
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j <= i; j++) {
            hBoxes.get(i).getChildren().add(new Button(i + "||" + j){
                {
                    setPrefSize(100,60);
                    setOnAction(e-> System.out.println("My coordinates are: " + localToScene(getBoundsInLocal().getMinX(),getBoundsInLocal().getMinY())));
                }
            });
        }
    }
    vBox.getChildren().addAll(hBoxes);

}
}

Upvotes: 0

Views: 630

Answers (1)

fabian
fabian

Reputation: 82491

boundsInLocal are coordinates in the Button's own coordinate system. It's not surprising, that these values are the same.
If you want to calculate the coordinates in the Canvas coordinate system, transform the coordinates to the StackPane coordinates and then transform the coordinates to the Canvas coordinates:

Node n = button;
Point2D p = new Point2D(button.getBoundsInLocal().getMinX(), button.getBoundsInLocal().getMinY());
while (n != stackPane) {
     p = n.localToParent(p);
     n = n.getParent();
}

p = canvas.parentToLocal(p);

Upvotes: 2

Related Questions