2014-10-10 2 views
0

на данный момент я программирую систему Chat на базе базы данных. Список друзей каждого пользователя получает загрузку в TreeView после входа в систему.Как дать динамически загруженный TreeViewItem EventHandler?

средства: После входа я заказываю имена useres друзей по следующему Funktion, String namesSt[] = get.getUserFriendNameByUserID(currentUserID);

использовать данные имена, чтобы загрузить их в качестве TreeItem в мой список друзей/TreeRootItem «rootItem»

for (int counter = 0; counter < namesSt.length; counter++) { 
     System.out.println(namesSt[counter]); 
     TreeItem<String> item = new TreeItem<String> (namesSt[counter]); 

     item.addEventHandler(MouseEvent.MOUSE_CLICKED,handler); 

     rootItem.getChildren().add(item); 
    } 

Когда я теперь добавляю свой rootItem, я вижу Имена в TreeView. Но если я нажму на имя, данный MouseEventHandler не будет вызван.

Далее я просто хочу запросить текст элемента, который запускает MouseEvent, чтобы я мог передать это имя в специальную функцию.

Как я могу реализовать такой MouseEvent? Как можно назвать это динамически созданным TreeItem?

Спасибо за любую помощь :)

cheerse Tobi

ответ

3

TreeItem s представляют данные, а не компонент пользовательского интерфейса. Таким образом, они не генерируют события мыши. Вам необходимо зарегистрировать прослушиватель мыши на TreeCell. Для этого установите заводскую ячейку на TreeView. Фабрика ячеек - это функция, которая создает TreeCell с, поскольку они необходимы. Таким образом, это будет работать и для динамически добавленных элементов дерева.

Вам нужно что-то вроде этого:

TreeView<String> treeView ; 

// ... 

treeView.setCellFactory(tv -> { 
    TreeCell<String> cell = new TreeCell<>(); 
    cell.textProperty().bind(cell.itemProperty()); 
    cell.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> { 
     if (! cell.isEmpty()) { 
      String value = cell.getItem(); 
      TreeItem<String> treeItem = cell.getTreeItem(); // if needed 
      // process ... 
     } 
    }); 
    return cell ; 
} 
+0

я извиняюсь, но я не понимаю, этот пример вовсе. Как этот пример будет работать, если TreeCell не из String, а из CustomObject? Особенно: 'cell.textProperty(). Bind (cell.itemProperty());' Я не понимаю: где должен быть только что созданный объект TreeCell с каким-либо itemProperty? – Hannes

+0

Если это не 'String', то вы используете либо другое связывание, либо слушатель в itemProperty, который обновляет свойство text, или использует реализацию TreeCell, которая переопределяет' updateItem (...) '. Прочтите документацию ['Cell'] (http://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/Cell.html) для полного объяснения того, как работают ячейки. –

+0

Я пробовал это так: http://pastebin.com/UDv1ziZQ Результат: отображается 0,1,2,3, после чего все равно NULL. Я просто не понимаю эту концепцию ... – Hannes

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