Как удалить узел, зная его Id - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь удалить определенные метки из VBox, зная их идентификаторы после нажатия кнопки.

Я выбираю метки с помощью мыши и сохраняю их идентификаторы в ArrayList, называемые отмеченными номерами. Когда я нажимаю deleteButton, я пытаюсь пройти через этот ArrayList и удалить эти метки и очистить массив. Я пытался добиться этого с помощью VBox.getChildren (). Remowe (идентификатор метки), но, похоже, это не сработало.

Код, который имеет какое-либо отношение к этой проблеме, следующий:

Контроллер:

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

    }

}

1 Ответ

0 голосов
/ 31 августа 2018

Кажется, что вы пытаетесь удалить дочерние элементы по идентификатору, но метод VBoxId.getChildren (). Remove ожидает индекс из списка, возвращаемого функцией VBoxId.getChildren. Я бы предложил сохранить отмеченные объекты в наборе вместо сохранения их идентификаторов.

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