2015-05-29 5 views
0

У меня есть TreeView со многими TreeItem. что я хочу сделать, так это то, что я разрешаю модификацию выбранного TreeItem и отключать его для других. Чтобы получить все TreeView быть изменяемым я использую:JavaFX - как установить CellFactory для конкретного TreeItem

syTree.setEditable(true); 
    syTree.setCellFactory(TextFieldTreeCell.forTreeView()); 

     } 

     syTree.setOnEditCommit(new EventHandler<TreeView.EditEvent<String>>() { 
      @Override 
      public void handle(TreeView.EditEvent<String> t) {  

syTree.getRoot().getChildren().set(syTree.getRow(t.getTreeItem()), new TreeItem<String>(t.getNewValue())); 
       System.out.println("setOnEditCommit"); 
       //} 
      } 

     }); 
     syTree.setOnEditCancel(new EventHandler<TreeView.EditEvent<String>>() { 
       @Override 
       public void handle(TreeView.EditEvent<String> t) { 
        System.out.println("setOnEditCancel"); 
       } 
      }); 

Эта линия просто изменить все к TextField элементов дерева при попытке изменить: syTree.setCellFactory(TextFieldTreeCell.forTreeView()); Как это сделать для конкретного TreeItem? Любая помощь, пожалуйста?

+1

Вы говорите, что если вы дважды щелкните ячейку в дереве, чтобы попытаться изменить его, все ячейки отображения 'TextField' ?? Похоже, что с некоторым кодом, который вы нам не показываете, есть что-то совершенно неправильное. Можете ли вы создать и опубликовать простой [MCVE] (http://stackoverflow.com/help/mcve), который показывает это поведение? –

+0

Этот код делает так, как вы сказали точно! и это работает! (Дважды щелкните элемент -> TreeItem в TextFied, нажав кнопку ввода -> новый TreeItem с измененным значением, возьмите старое место «это то, что делает setEditCommit»), что я все еще пытаюсь сделать, для например, активируйте эту функцию только для детей определенного TreeItem, потому что теперь они работают для всех. – Calips

+0

Это технически возможно? – Calips

ответ

2

Я думаю, вы говорите, что хотите, чтобы некоторые ячейки были доступны для редактирования, а некоторые из них не подлежат редактированию, в зависимости от некоторого состояния на отображаемом TreeItem. Если это так, то возможно, вам просто нужно сделать немного больше работы с вашей клеточной фабрики:

Callback<TreeView<String>, TreeCell<String>> defaultCellFactory = TextFieldTreeCell.forTreeView(); 

syTree.setCellFactory((TreeView<String> tv) -> { 
    TreeCell<String> cell = defaultCellFactory.call(tv); 
    cell.treeItemProperty().addListener((obs, oldTreeItem, newTreeItem) -> { 
     if (newTreeItem == null) { 
      cell.setEditable(false); 
     } else if (/* newTreeItem should be editable */) { 
      cell.setEditable(true); 
     } else { 
      cell.setEditable(false); 
     } 
    }); 
    return cell ; 
}); 
+0

YESSSSSSSS! это оно !! Большое спасибо @James_D, всегда экономя мой день! – Calips

Смежные вопросы