Search code examples
javajavafxlabelnodes

How to remove node knowing its id


I'm trying to remove a particular labels from a VBox knowin their IDs after button is pressed.

I'm selecting labels with mouse and store their IDs in ArrayList called markedNumbers. When I press deleteButton I'm trying to go through this ArrayList and delete these labels and clear array. I was trying to achieve this with VBox.getChildren().remowe (Id of label) but it doesn't seem to work.

A code that has any connection to this problem is following:

Controller:

    package sample;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
import java.util.ArrayList;

public class Controller {
@FXML
private TextField numberField;
@FXML
private VBox VBoxId;
@FXML
private Label averageLabel;

private ArrayList<Double> numbersList = new ArrayList<>();
private String numberFieldContent;
numberClass numberObject = new numberClass();
private ArrayList<Integer> markedNumbers = new ArrayList<>();

@FXML
public void onNewNumberButton(){
    averageLabel.setVisible(false);
    numberFieldContent = numberField.getText();
    numberObject.addNumber(numberFieldContent);
    if(numberObject.isDataCorrect()){
        numberField.clear();
        Label numberLabel = new LabelClass(numberFieldContent,String.valueOf(numberObject.arraySize())).createLabel(EventHandler);
        VBoxId.getChildren().add(numberLabel);
        System.out.println("numberLabel id: " + numberLabel.getId());

    }else {
        numberField.clear();
    }
    numberObject.setDataCorrect(false);
}

javafx.event.EventHandler<MouseEvent> EventHandler = new javafx.event.EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent event) {
        marked(event.getSource());
    }
};

@FXML
public void onEnterPressed (KeyEvent key){
    if(key.getCode().equals(KeyCode.ENTER)){
        onNewNumberButton();
    }
}

public void marked(Object object){
    Label label = (Label) object;
    LabelClass labelClass = new LabelClass(label.getText(),label.getId());
    labelClass.markLabel(label);
    markedNumbers.add(Integer.parseInt(label.getId()));
    System.out.print("markedNumber list contains now: ");
    for(int i =0; i<markedNumbers.size();i++){
        System.out.print(markedNumbers.get(i) + ", ");
    }

}

public void onCalculateButton(){
    if(numberObject.arraySize()>0) {
        averageLabel.setVisible(true);
        averageLabel.setText("Average = " + numberObject.calculate());
    }
}

public void onDeleteButton(){
    for(int i =0;i<markedNumbers.size();i++){
        VBoxId.getChildren().remove(markedNumbers.get(i));
        System.out.println("Label with id: " + markedNumbers.get(i) + " got removed.");
    }
    markedNumbers.clear();
}


}

LabelClass:

package sample;
import javafx.event.EventHandler;
import javafx.scene.control.Label;
import javafx.scene.paint.Paint;

public class LabelClass {

    private double content;
    private String index;

    public LabelClass(String content, String index) {
        this.content = Double.parseDouble(content);
        this.index = index;
    }

    public Label createLabel (EventHandler eventHandler){
        Label numberLabel = new Label(String.valueOf(content));
        numberLabel.setId(index);
        numberLabel.addEventFilter(javafx.scene.input.MouseEvent.MOUSE_CLICKED, eventHandler);
        return numberLabel;
    }
    public void markLabel(Label label){
        label.setTextFill(Paint.valueOf("RED"));
        System.out.println("Label that turned red id: " + label.getId());
    }

    public void delete(int index){
        Label label = new Label();
        label.setId(String.valueOf(index));

    }

}

Solution

  • It seems like you are trying to remove childs by id, but method VBoxId.getChildren().remove expects an index from list returned by VBoxId.getChildren function. I would propose you save Marked objects in Set instead of saving their ids.

    private Set<Node> markedNumbers = new HashSet<>();
    
    ...
    public void marked(Object object){
        Label label = (Label) object;
        markedNumbers.add(label);
    }
    ...
    
    public void onDeleteButton(){
        for(Node node :markedNumbers){
            VBoxId.getChildren().remove(node);
        }
        markedNumbers.clear();
    }