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));
}
}
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();
}