James_Duh
James_Duh

Reputation: 1371

JavaFX Dynamically add Nodes to pane with fx:id or id

I can create Nodes on a pane with a for next loop, but do not have the ability to assign these nodes a fx:id or a id Is this possible number one? If so what do I need to add to my code? Or do I have the option to write the information to a FXML file with the for next loop?

    private void MakeNode(){
    for (int A = 1; A <= 42; A++){
    if(A==1){
        X=40;
        Y=40;
    }else if(A>1 && A<=7){
        X = X + 120;
        Y = 40;
    }else if(A==8){
        X = 40;
        Y = 160;
    }else if(A>8&& A<=14){
        X = X + 120;
        Y = 160;
    }else if(A==15){
        X = 40;
        Y = 280;
    }else if(A>15&& A<=21){
        X = X + 120;
        Y = 280;
    }else if(A==22){
        X = 40;
        Y = 400;
    }else if(A>22&& A<=28){
        X = X + 120;
        Y = 400;
    }else if(A==29){
        X = 40;
        Y = 520;
    }else if(A>29&& A<=35){
        X = X + 120;
        Y = 520;
    }else if(A==36){
        X = 40;
        Y = 640;
    }else if(A>36&& A<=42){
        X = X + 120;
        Y = 640;
    }
        cirA = new Circle(X,Y,16);
        //fxid = cir.concat(String.valueOf(A));
        //fxid = cir+String.valueOf(A);
        //cirA.setId(fxid);
        cirA.setFill(Color.YELLOW);
        cirA.setStroke(Color.BLACK);
        cirA.setStrokeWidth(4.0);
        pane.getChildren().add(cirA);

    }
}

Upvotes: 0

Views: 1937

Answers (1)

James_D
James_D

Reputation: 209319

fx:id is just a mechanism for getting a reference to elements defined in FXML to the controller. If you are defining nodes in the controller anyway, there is no need for (or indeed, no way to use) fx:id at all.

You already have a reference to the Circle when you create it. So just do whatever you need right there. Here's a simple example (I cleaned your code up to make it much less verbose):

private void makeNode() {
    for (int circleIndex = 0 ; circleIndex < 42 ; circleIndex++) {
        int column = circleIndex % 7 ;
        int row = circleIndex / 7 ;
        double x = 40 + 120 * column ;
        double y = 40 + 120 * row ;
        Circle circle = new Circle(x, y, 16);
        circle.setFill(Color.YELLOW);
        circle.setStroke(Color.BLACK);
        circle.setStrokeWidth(4.0);
        pane.getChildren().add(circle);

        circle.setOnMouseClicked(e -> {
            System.out.println("Clicked on ["+column+", "+row+"]");
        });
    }
}

Upvotes: 2

Related Questions