【问题标题】:Custom CellFactory adds new nodes自定义 CellFactory 添加新节点
【发布时间】:2018-03-12 10:30:33
【问题描述】:

我有一个奇怪的错误,我找不到合适的解决方案。 我想在我的应用程序中添加一个显示任务分类的 TreeTableView。 由于用户可以自己添加任务,但这些任务必须与已经存在的任务区分开来,我希望它们在我的 TreeView 中是黄色的。因此我添加了一个自定义 CellFactory:

public class TaskLibrary extends AnchorPane {
    @FXML
    private TreeTableColumn<Task,String> mainColumn;
    @FXML
    private TreeTableView<Task> taskTreeTableView;

    public TaskLibrary(){
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(getClass().getResource("../layout/TaskLibrary.fxml"));
            loader.setRoot(this);
            loader.setController(this);
            loader.load();
            mainColumn.setCellValueFactory(param -> param.getValue().getValue().taskNameProperty());
            mainColumn.setCellFactory(param -> new TreeTableCell<Task,String>(){
                @Override
                protected void updateItem(String item, boolean empty) {
                    super.updateItem(item, empty);
                    Task listObject = this.getTreeTableRow().getItem();
                    if (listObject != null) {
                        if (item == null || empty) {
                            setText("");
                            setStyle("");
                        } else {
                            if (listObject.getIsDummy()) {
                                setStyle("-fx-background-color: yellow");
                            }
                            setText(listObject.getTaskName());
                        }
                    }
                }
            });

        }
        catch (IOException e){
            throw new RuntimeException(e);
        }
    }

    @FXML
    public void addNewTask(){
    }
    public void setColumnText(String text){
        mainColumn.setText(text);
    }

    public void enableDragAndDrop(){
        TaskTreeRowFactory fac = new TaskTreeRowFactory();
        taskTreeTableView.setRowFactory(fac::internalMoveFactory);
    }

    public TreeTableColumn<Task, String> getMainColumn() {
        return mainColumn;
    }

    public void setMainColumn(TreeTableColumn<Task, String> mainColumn) {
        this.mainColumn = mainColumn;
    }

    public TreeTableView<Task> getTaskTreeTableView() {
        return taskTreeTableView;
    }

    public void setTaskTreeTableView(TreeTableView<Task> taskTreeTableView) {
        this.taskTreeTableView = taskTreeTableView;
    }
}

现在有一个奇怪的错误,在我的树视图中展开最后一个节点会导致一个新节点:

有什么我错过的吗?

【问题讨论】:

  • 如果单元格为空,listObject 将为空,您的updateItem 方法不会执行任何操作。因此,如果一个单元格从非空变为空(例如,当用户折叠树中的一个节点时),您不会删除现有文本。每当单元格为空时,您都需要删除文本(并清除样式)。
  • 不错!那是为我做的。不是很直观,但我想更多的是我对 JavaFX 缺乏了解!
  • 如果它有助于您的直觉:您的单元格有三种可能的感兴趣状态:空、显示虚拟项目、显示非虚拟项目。您的 updateItem() 方法需要处理从任何一种状态到任何其他状态的转换,以及简单地更改为处于相同状态的不同项目。

标签: java javafx


【解决方案1】:

如果行的项目不是null,您只能操作单元格。但是,如果该行变为空,则单元格也会变为空,但 this.getTreeTableRow().getItem() 产生 null 并且您不会修改单元格以使其看起来为空。当单元格为空时,您需要始终清除text/style

if (empty || item == null || listObject == null) {
    setText("");
    setStyle("");
} else {
    setStyle(listObject.getIsDummy() ? "-fx-background-color: yellow" : "");
    setText(listObject.getTaskName());
}

【讨论】:

    猜你喜欢
    • 2017-08-18
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 2019-10-24
    • 2015-05-22
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多