码:

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/

10-09 09:16