2014-04-02 3 views
0

У меня есть следующие в моем FXMLController:JavaFX табличного дерева Удалить элемент ContextMenu

@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; 
     } 

    }); 
//... 
} 

Песня класс, который наследует от FileModel. В основном, я создаю свою собственную фабрику строк, где я удаляю выбранный элемент, но ничего не происходит. Элемент управления TreeTableView не удаляется, но он удаляется из ObservableList.

Что мне не хватает или неправильно понято? Спасибо заранее.

+0

Что-то выглядит странно с вашей моделью. Ваш TreeTableRow является TreeTableRow , поэтому row.getItem() вернет объект FileModel. данные являются ObservableList и состоят из объектов Song. Таким образом, не кажется, что row.getItem() может когда-либо быть членом данных, поэтому data.remove (row.getItem()) должен в основном быть не-op. –

+0

Песня - это FileModel. Он удаляется из данных, но не из treeTable –

ответ

1

Я не работал с TreeTableView, так что это немного выстрел в темноте: но TreeTableView s (и TreeView s) не подключены к данным столь же чисто, как TableView с. Каждый элемент данных завернут в TreeItem, чтобы присвоить ему иерархическую структуру. Поэтому я думаю, вам нужно что-то вроде

  @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"); 
      } 
+0

это был блестящий снимок :) ..работано. Я думал, что механизм с наблюдаемымArrayList будет делать то же самое, но при этом я должен был реализовать свой собственный changeListener на этой модели –