gpt4 book ai didi

listview - 从 ListView 中删除项目的奇怪行为

转载 作者:行者123 更新时间:2023-12-01 08:57:55 25 4
gpt4 key购买 nike

我正在使用 ListView。向 ListView 添加新项目很容易,但如何删除呢?

我以这种方式构建我的 ListView:

public Node buildListView() {
ObservableList<String> myList = FXCollections.observableArrayList();
int counter = 0;
for(int i=0; i<10; i++) {
myList.add("Number " + new Integer(i+1).toString());
}
ListView<String> listView = new ListView<>();
listView.setItems(myList);

listView.setCellFactory(new Callback<ListView<String>, ListCell<String>> (){
@Override
public ListCell<String> call(ListView<String> arg0) {
return new listcells.ListcellY(listView);

}

});
return listView;
}

ListcellY 的一个实例在 setGraphics 中设置一个标签。要从我的 ObservableList 中删除与其关联的字符串,我添加了一个 MouseEvent 处理程序:

public class ListcellY extends ListCell<String> {
Label label;
HBox hbox;
ListView<String> listView;

public ListcellY( ListView<String> listView ) {
super();
this.listView = listView; // Here I pass the reference to my list. Is it a gd way to do that?
}
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if(item!=null){
label = new Label(item);

label.addEventHandler(MouseEvent.MOUSE_CLICKED, e -> {
System.out.println("CLicked on : " + item);
for(String s : listView.getItems()) {
System.out.println(" " + s);
}

listView.getItems().remove(item); // Here I remove the item form my list.
System.out.println("list size : " + listView.getItems().size());
});
setGraphic(label);

}

}
}

虽然此代码通过从我的 ObservableList 中删除每个单击的项目来工作,但 listView 的行为很奇怪。每次单击标签时,它都会从我的 ListView 中成功消失,但是会在该 ListView 的末尾自动添加一个新项目,并显示最后一个标签文本的名称(但它不是可单击的标签)。它不断重复,直到我的 ObservableList 为空。然后 ListView 什么都不显示。

我只是想让我点击的标签消失,而不会在我的 TreeView 中获得任何新的“视觉副本”。如果索引参数设置为我的 ObservableList 的原始大小,则为 s,然后 ListView 复制最后一个元素,直到它获得正确数量的元素。但我不明白它是怎么做到的。

我能做什么,首先发生了什么?

最佳答案

好的,似乎写下你的问题可以让你的大脑更好地工作!我有正确的直觉:在我的扩展 ListCell 类中,我检查了覆盖的更新方法是否我的项目不为空。但是我不处理它为空的情况,在这种情况下我必须将图形设置为空!我仍然不明白为什么,但它有效!这是更新的类(class):

public class ListcellY extends ListCell<String> {
Label label;
HBox hbox;
ListView<String> listView;

public ListcellY( ListView<String> listView ) {
super();
this.listView = listView; // Here I pass the reference to my list. Is it a gd way to do that?
}
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if(item!=null){
label = new Label(item);

label.addEventHandler(MouseEvent.MOUSE_CLICKED, e -> {
System.out.println("CLicked on : " + item);
for(String s : listView.getItems()) {
System.out.println(" " + s);
}

listView.getItems().remove(item); // Here I remove the item form my list.
System.out.println("list size : " + listView.getItems().size());
});
setGraphic(label);

}
else {
setGraphics(null);
}

}
}

关于listview - 从 ListView 中删除项目的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25286355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com