码:
mpcListView.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
@Override
public ListCell<String> call(ListView<String> param){
return new XCell();
}
});
public class XCell extends ListCell<String>{
HBox hbox = new HBox();
Label label = new Label();
Button button = new Button("",getImage());
String lastItem;
public XCell(){
super();
hbox.setSpacing(120);
hbox.getChildren().addAll(label,button);
button.setOnAction(new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent event){
mpcListView.getItems().remove(lastItem);
}
});
}
@Override
protected void updateItem(String item, boolean empty){
super.updateItem(item, empty);
if (empty){
lastItem = null;
setGraphic(null);
}else{
lastItem = item;
label.setText(item);
setGraphic(hbox);
}
}
}
为什么要调用
super.updateItem(item, empty)
? 最佳答案
ListCell updateItem(...)实现非常重要,因为它调用Cell updateItem(...)实现,该实现检查其是否为空,并调用正确的方法:setItem(...)或setEmpty(...)。
如果不调用super.updateItem(...),则不调用Cell.updateItem(...),不调用setItem(...),则不会进行任何操作或不更新值! ListCell只是在使用Cell updateItem实现之前添加了一些检查,因此您有两种选择:
您可以在自定义ListCell实现中调用super.updateItem(...)
您可以在updateItem实现中调用setItem(...)和setEmpty(...),并在检查和编辑内容时“绕过” ListCell实现
请注意,ListCell不是ListView使用的“基本”实现。请改为参考TextFieldListCell类,它是一个很好的示例,说明了它如何实际工作,从汞库获取信息并进行阅读,这始终是最好的方法。
例如,TextFieldListCell使用super.updateItem(...)调用Cell.updateItem实现以检查它是否为空(通过使用setItem或setEmpty),然后使用javafx.scene.control.cell.CellUtils.updateItem(。 ..)。此方法获取在当前单元格中设置的项目,然后使用该项目上的转换器在Label中显示字符串。
关于java - 为什么在javafx中的listview.cellFacoty方法中调用super.updateItem(item,empty)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22573496/