Событие действия элемента дерева Javafx

java event-handling javafx

22582 просмотра

3 ответа

6767 Репутация автора

Я пытаюсь создать меню с помощью TreeView. Это первый раз, когда я использую treeView и читал об этом на нескольких сайтах.

У меня есть некоторые проблемы, когда дело доходит до события. То, что я хочу сделать, это в основном вызывать и генерировать события, когда пользователь щелкает узел в древовидной структуре, пока у меня есть следующее:

        TreeItem<String> rootItem = new TreeItem<String>("Navigation");
    TreeItem<String> statistics = new TreeItem<String>("Statistics");
    TreeItem<String> clan = new TreeItem<String>("Clan page");
    clan.addEventHandler(MouseEvent, new EventHandler<MouseEvent>() {

        @Override
        public void handle(MouseEvent event) {
            // TODO Auto-generated method stub

        }
    });

    rootItem.getChildren().add(statistics);
    rootItem.getChildren().add(clan);

    TreeView<String> tree = new TreeView<String>(rootItem); 

К сожалению, это не похоже на работу.

Могу ли я добавить clicklistenerили даже actionlistenerк отдельным элементам в моем, treeViewне меняя treeItemsтип Button?

Автор: Marc Rasmussen Источник Размещён: 03.04.2013 03:52

Ответы (3)


6 плюса

10360 Репутация автора

Решение

Согласно документации JavaFX 2.2 :

«..a TreeItem не является узлом , и, следовательно, никакие визуальные события не будут запущены для TreeItem. Чтобы получить эти события, необходимо добавить соответствующие наблюдатели в экземпляры TreeCell (через собственную фабрику ячеек)».

Я думаю, что этот пример использования TreeViewбудет как-то полезен.

Автор: tarrsalah Размещён: 03.04.2013 07:35

13 плюса

431 Репутация автора

Это может быть решено путем реализации CellFactory, но я думаю, что самый простой способ это так:

1) Создайте и добавьте обработчик событий в TreeView:

EventHandler<MouseEvent> mouseEventHandle = (MouseEvent event) -> {
    handleMouseClicked(event);
};

treeView.addEventHandler(MouseEvent.MOUSE_CLICKED, mouseEventHandle); 

2) Обрабатывать только щелчки по узлам (а не по пробелам в TreeView):

private void handleMouseClicked(MouseEvent event) {
    Node node = event.getPickResult().getIntersectedNode();
    // Accept clicks only on node cells, and not on empty spaces of the TreeView
    if (node instanceof Text || (node instanceof TreeCell && ((TreeCell) node).getText() != null)) {
        String name = (String) ((TreeItem)treeView.getSelectionModel().getSelectedItem()).getValue();
        System.out.println("Node click: " + name);
    }
}
Автор: Alexandre Размещён: 03.11.2014 01:00

6 плюса

79 Репутация автора

Я не смог найти метод getPickResult в событии мыши, поэтому может быть предпочтительнее следующий, чем ответ от Алекса:

1) добавить слушателя в дерево

treeView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> handle(newValue));

2) обрабатывать клики, не нужно различать клики по пустому пространству и узлам

private void updateSelectedItem(Object newValue) {      
    System.out.println(newValue);
}
Автор: user1628407 Размещён: 05.07.2015 03:10
Вопросы из категории :
32x32