繁体   English   中英

JavaFX ListView CellFactory禁用项目选择

[英]JavaFX ListView CellFactory Disables Item Selection

我有一个具有一些值的类( ListItem ),我想显示这些项的列表( ListView<ListItem> )。 ListItem有一个value属性,我希望ListView<ListItem>显示为其文本,但是否则列表应该看起来和功能正常,特别是关于项目选择。 我有以下代码来完成此任务。 懒惰中省略了FXML,它只是一个<ListView />

// Controller for FXML
public class MainController {
    // Wrapper class containing several values
    private class ListItem {
        private String value;

        public ListItem(String value) {
            this.value = value;
        }

        public String getValue() {
            return value;
        }

        ... // Other useful stuff
    }

    @FXML private ListView<ListItem> list;

    @FXML
    public void initialize() {
        // Set list to display using the given CellFactory
        list.setCellFactory((list) -> {
            return new ListCell<ListItem>() {
                @Override
                protected void updateItem(ListItem item, boolean empty) {
                    if (empty) return;

                    // Display item's value property
                    setText(item.getValue());
                }
            };
        });

        // Add test data
        list.getItems().add(new ListItem("test"));
        list.getItems().add(new ListItem("test2"));

        // Print when selection changes
        list.getSelectionModel().selectedItemProperty().addListener((evt) -> {
            System.out.println("Selection changed!");
        });
    }
}

这会在ListView每个项目中使用其value属性正确显示ListItem 然而,它打破了选择,和System.out.println(...)不执行(该项目也没有在GUI中突显)。 我发现删除list.setCellFactory(...)语句是罪魁祸首,但让我陷入了困境。

当存在list.setCellFactory(...) ,该项使用正确的文本,但无法选择。 list.setCellFactory(...)不存在时,该项目使用错误的文本,但可以选择。 为了正确显示文本选择项目,我还需要做一些其他的特殊工作吗?

我已经完成了先决条件谷歌搜索,但我找不到其他任何有这个特殊问题的人。 任何帮助是极大的赞赏。

你需要添加

super.updateItem(item, empty);

作为updateItem(...)的第一行。 这个呼叫必须始终存在于一个重写Cell.updateItem(...)方法(同样为其他真updateXXX方法,如updateIndex(...)

此外,还应确保updateItem(...)方法正确处理所有情况,包括单元格为空的情况:

protected void updateItem(ListItem item, boolean empty) {
    super.updateItem(item, empty);
    if (empty) {
        setText(null);
    } else {
        // Display item's value property
        setText(item.getValue());
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM