我的点击侦听器带有ListView。我想在悬停时添加新的侦听器。我用CellFactory(下面的代码)编码了这个新的监听器。只有使用此代码,我的ListView<String>)才能显示没有文本的项目,但两个侦听器都可以正常工作(单击侦听器仍然可以正常工作),并且可以正确选择项目。

CellFactoryController中的initialize()代码:

myListView.setCellFactory(lv -> {
        ListCell<String> cell = new ListCell<String>() {};
        cell.hoverProperty().addListener((obs, wasHovered, isNowHovered) -> {
        if(isNowHovered) {
            handleCellHover(cell);
        } else {
            handleCellHoverEnd();
        }
    });
    return cell;
});


添加元素的代码:

// ...
ObservableList<String> data = FXCollections.observableArrayList(data); //data is List<String>
listView.setItems(data);

最佳答案

默认情况下,ListCell.updateItem除了分配itemempty属性外,不执行任何操作。您需要重写此方法,才能使用该项来修改单元格的外观,例如通过设置text属性:

ListCell<String> cell = new ListCell<String>() {
    @Override
    protected void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);

        if (empty || item == null) {
            setText("");
        } else {
            setText(item);
        }
    }
};


(默认的cellFactory使用具有类似ListCell实现的updateItem子类。)

09-13 13:59