如何删除知道其Id的节点

问题描述 投票:0回答:1

我试图在按下按钮后从VBox中删除特定标签,知道他们的ID。

我用鼠标选择标签并将其ID存储在名为markedNumbers的ArrayList中。当我按下deleteButton时,我正在尝试浏览此ArrayList并删除这些标签并清除数组。我试图用VBox.getChildren()。remowe(标签的ID)来实现这一点,但它似乎不起作用。

与此问题有任何关联的代码如下:

控制器:

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

    }

}
java javafx label nodes id
1个回答
0
投票

您似乎试图通过id删除子节点,但方法VBoxId.getChildren()。remove需要VBoxId.getChildren函数返回的列表中的索引。我建议你在Set中保存标记对象而不是保存它们的id。

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();
}
© www.soinside.com 2019 - 2024. All rights reserved.