我正在使用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中删除与之关联的String,我添加一个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的原始大小,则ListView会复制最后一个元素,直到它获得正确数量的元素。但我不明白它是如何完成的。
我能做什么,首先发生了什么?
答案 0 :(得分:9)
好吧,好像写你的问题让你的大脑更好!我有正确的直觉: 在我的扩展ListCell类中,我检查重写更新方法我的项是否为空。但是当它为null时我不处理这种情况,在这种情况下我必须将图形设置为null!我仍然不明白为什么,但它的确有效! 这是更新的课程:
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);
}
}
}