首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaFX TreeTableView删除项目ContextMenu

JavaFX TreeTableView删除项目ContextMenu
EN

Stack Overflow用户
提问于 2014-04-02 17:05:48
回答 1查看 2.6K关注 0票数 0

我的FXMLController中有以下内容:

代码语言:javascript
复制
@FXML
TreeTableView<FileModel> treeTblViewFiles;
//...
@Override
public void initialize(URL url, ResourceBundle rb) {
//...
     final ObservableList<Song> data = FXCollections.observableArrayList(
            new Song("Song#1", "/home/pm/songs/song1.mp3","12MB"),
            new Song("Song#2", "/home/pm/songs/song2.mp3","12MB"),
            new Song("Song#3", "/home/pm/songs/song3.mp3","12MB"),
            new Song("Song#4", "/home/pm/songs/song4.mp3","12MB"),
            new Song("Song#5", "/home/pm/songs/song5.mp3","12MB"),
            new Song("Song#6", "/home/pm/songs/song6.mp3","12MB"),
            new Song("Song#7", "/home/pm/songs/song7.mp3","12MB"),
            new Song("Song#8", "/home/pm/songs/song8.mp3","12MB"),
            new Song("Song#9", "/home/pm/songs/song9.mp3","12MB"),
            new Song("Song#10", "/home/pm/songs/song10.mp3","12MB")
    );
     treeTblViewFiles.setRowFactory(new Callback<TreeTableView<FileModel>, TreeTableRow<FileModel>>(){

        @Override
        public TreeTableRow<FileModel> call(TreeTableView<FileModel> treeTableView) {
            final TreeTableRow<FileModel> row = new TreeTableRow<>();
            final ContextMenu rowMenu = new ContextMenu();
            MenuItem removeItem = new MenuItem("Remove");
            removeItem.setOnAction(new EventHandler<ActionEvent>(){

                @Override
                public void handle(ActionEvent t) {                        
                    data.remove(row.getItem());
                    treeTblViewFiles.getSelectionModel().clearSelection();
                    System.out.println("Context Menu -> ActionEvent");
                }

            });
            rowMenu.getItems().add(removeItem);
            row.contextMenuProperty().bind(Bindings.when(Bindings.isNotNull(row.itemProperty()))
            .then(rowMenu)
            .otherwise((ContextMenu)null));
            return row;
        }

    });
//...
}

Song是继承自FileModel的类。基本上,我所做的是创建我的自定义行工厂,在这里我删除了所选的项目,但是什么也没有发生。没有从treeTableView控件中删除任何项,尽管它是从ObservableList中删除的。

我错过了什么或者被误解了什么?提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-03 13:06:40

我没有使用过TreeTableView,所以这是一种隐秘的尝试:但是TreeTableView(和TreeViews)并没有TableView那样干净地连接到数据上。每个数据项都封装在一个TreeItem中,为它提供了分层结构。所以我觉得你需要的是

代码语言:javascript
复制
            @Override
            public void handle(ActionEvent t) {  

                data.remove(row.getItem());
                TreeItem<FileModel> treeItem = row.getTreeItem();
                // may need to check treeItem.getParent() is not null:
                treeItem.getParent().getChildren().remove(treeItem);
                treeTblViewFiles.getSelectionModel().clearSelection();
                System.out.println("Context Menu -> ActionEvent");
            }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22818305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档