Search code examples
javajavafxlabelinstances

How to set the text of an instantiated label?


I am teaching my self java(fx) in order to create some applications for my small business.

However I am stuck with the problem below. The actual program is much larger and complicated so I created a new, smaller and easier on the eye class to get some help for something that has me stumped for more than a week

The code below creates 3 instances of a label with different ids (in case it can help). Is there any way to change the text of (let's say) Label 2 to something else by pressing the button?

This is really my last hope to find a solution.

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class Test extends Application {

@Override
public void start(Stage primaryStage) {

    Button btn = new Button();
    btn.setText("Change Label 2 text to something else");
    btn.setLayoutX(220);
    btn.setLayoutY(250);

    btn.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {
            //????????????????????????????????????
        }
    });

    Pane root = new Pane();
    root.getChildren().add(btn);

    for(int i=1; i<=3; i++){
        Label label = new Label("Label "+i);
        label.setId(String.valueOf(i));
        label.setLayoutX(i*60);
        label.setLayoutY(i*60);
        root.getChildren().add(label);
    }

    Scene scene = new Scene(root, 600, 500);

    primaryStage.setTitle("Instances");
    primaryStage.setScene(scene);
    primaryStage.show();
}

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

}


Solution

  • You are creating one same instance of Label three times. Instead, create array of Labels Something like this:

    import javafx.application.Application;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.Label;
    import javafx.scene.layout.Pane;
    import javafx.stage.Stage;
    
    public class Test extends Application {
    
        @Override
        public void start(Stage primaryStage) {
            Label[] labels = new Label[3];
    
            Button btn = new Button();
            btn.setText("Change Label 2 text to something else");
            btn.setLayoutX(220);
            btn.setLayoutY(250);
    
            btn.setOnAction(new EventHandler<ActionEvent>() {
    
                @Override
                public void handle(ActionEvent event) {
                    labels[1].setText("Text changed");
                }
            });
    
            Pane root = new Pane();
            root.getChildren().add(btn);
    
            for (int i = 0; i < 3; i++) {
    
                labels[i] = new Label("Label " + i);
                labels[i].setId(String.valueOf(i));
                labels[i].setLayoutX(i * 60);
                labels[i].setLayoutY(i * 60);
                root.getChildren().add(labels[i]);
            }
    
            Scene scene = new Scene(root, 600, 500);
    
            primaryStage.setTitle("Instances");
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    Other side notes: Don't position your components like this:

    label.setLayoutX(i*60);
    label.setLayoutY(i*60);
    

    Use proper pane for layout.