Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / CheckBoxTreeItem.checkBoxSelectionChangedEvent / 17 сообщений из 17, страница 1 из 1
06.06.2017, 14:57
    #39466862
DNShark
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBoxTreeItem.checkBoxSelectionChangedEvent
В общем у меня есть дерево TreeView с CheckBoxTreeItem. И мне надо отследить событие изменения чеков. Вешается

Код: java
1.
treeView.getRoot().addEventHandler(CheckBoxTreeItem.checkBoxSelectionChangedEvent(), event -> System.out.println("hello"));



проблема в том что он срабатывает на каждое изменение чека, т.е. если анчекнуть дерево из 100 нод, он сработает 100 раз. А мне нужно чтобы один раз только сработал, чтобы можно было повесить обработчик. Вот думаю, как это можно сделать.

код для тестирования:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
package sample;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.CheckBoxTreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.control.cell.CheckBoxTreeCell;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        BorderPane root = new BorderPane();
        root.setCenter(initTreeView());
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));

        primaryStage.show();
    }

    public TreeView initTreeView() {
        TreeView<String> treeView = new TreeView<>();
        treeView.setRoot(new CheckBoxTreeItem<>("123"));
        treeView.getRoot().addEventHandler(CheckBoxTreeItem.checkBoxSelectionChangedEvent(), event -> System.out.println("hello"));
        treeView.setCellFactory(p -> new CheckBoxTreeCell<>());
        treeView.getRoot().getChildren().addAll(new CheckBoxTreeItem<>("1"),new CheckBoxTreeItem<>("2"), new CheckBoxTreeItem<>("3"));
        treeView.getRoot().getChildren().get(0).getChildren().addAll(new CheckBoxTreeItem<>("4"),new CheckBoxTreeItem<>("5"), new CheckBoxTreeItem<>("6"));
        treeView.getRoot().getChildren().get(1).getChildren().addAll(new CheckBoxTreeItem<>("7"),new CheckBoxTreeItem<>("8"), new CheckBoxTreeItem<>("9"));
        treeView.getRoot().getChildren().get(2).getChildren().addAll(new CheckBoxTreeItem<>("10"),new CheckBoxTreeItem<>("11"), new CheckBoxTreeItem<>("12"));
        return treeView;
    }


    public static void main(String[] args) {
        launch(args);
    }

}

...
Рейтинг: 0 / 0
06.06.2017, 15:23
    #39466905
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBoxTreeItem.checkBoxSelectionChangedEvent
DNSharkВот думаю, как это можно сделать.
onClick на дереве?
...
Рейтинг: 0 / 0
06.06.2017, 15:47
    #39466939
DNShark
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBoxTreeItem.checkBoxSelectionChangedEvent
Petro123,

попробовал добавить

Код: java
1.
treeView.setOnMouseClicked(event -> System.out.println("123"));



оно на expand и select срабатывает, а на сам check нет (. А другого onClick не нашел...
...
Рейтинг: 0 / 0
06.06.2017, 16:27
    #39467008
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBoxTreeItem.checkBoxSelectionChangedEvent
DNSharkоно на expand и select срабатывает, а на сам check нет (. А другого onClick не нашел...
зато один раз при 100 чеках)).
Сначала идёт клик, потом событие по чекам.
Опиши ещё раз, как ты одним кликом чекнул 100 нод за раз и зачем нужно событие.
...
Рейтинг: 0 / 0
06.06.2017, 16:32
    #39467015
DNShark
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBoxTreeItem.checkBoxSelectionChangedEvent
Petro123,

там root чекаешь, и всё дерево чекается. А онклик, не срабатывает на чек (.
...
Рейтинг: 0 / 0
06.06.2017, 16:34
    #39467020
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBoxTreeItem.checkBoxSelectionChangedEvent
DNSharkтам root чекаешь, и всё дерево чекается. А онклик, не срабатывает на чек (.
ну и нормально.
На событие проверяем ID Node или даже по названию. Если наше, то делаем что надо.
Тебе шашечки или ехать?
Чеки событие или Клики?
...
Рейтинг: 0 / 0
06.06.2017, 16:41
    #39467029
DNShark
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBoxTreeItem.checkBoxSelectionChangedEvent
Petro123,

мне надо график по чекнутым нодам строить, если анчекнул что-то то перестраивать. Т.е. по изменению чеков, мне надо получить коллекцию чекнутых нод и отдать её на построение графика.
...
Рейтинг: 0 / 0
06.06.2017, 16:52
    #39467047
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBoxTreeItem.checkBoxSelectionChangedEvent
DNSharkPetro123,
мне надо график по чекнутым нодам строить, если анчекнул что-то то перестраивать. Т.е. по изменению чеков, мне надо получить коллекцию чекнутых нод и отдать её на построение графика.
Тормозит? Или заранее оптимизация?
...
Рейтинг: 0 / 0
06.06.2017, 16:54
    #39467054
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBoxTreeItem.checkBoxSelectionChangedEvent
DNShark,
Как вариант, если тормозит, то можно запускать таймер на 0,2 сек на каждый чек. А на конец таймера процедуру построения.
На каждый чек сбрасывать таймер.
...
Рейтинг: 0 / 0
06.06.2017, 17:01
    #39467066
DNShark
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBoxTreeItem.checkBoxSelectionChangedEvent
Petro123,

вот оно сейчас как-то так и работает), устанавливается флаг запускается в потоке построение графика, после его построения, график отображается, и смотрится, было ли еще событие, потом еще раз строится. Но должен же быть путь поймать один раз чек... он ведь один раз проходит....
...
Рейтинг: 0 / 0
06.06.2017, 17:09
    #39467073
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBoxTreeItem.checkBoxSelectionChangedEvent
DNSharkвот оно сейчас как-то так и работает),
когда к доктору приходишь, он тоже издалека спрашивает)). Были ли удары головой в детстве LOL
- ты не ответил, тормозит ли без всей этой байды?
DNSharkНо должен же быть путь поймать один раз чек... он ведь один раз проходит....
думаю что в дереве на root чек = придёт столько раз сколько реально чеков будет.
А также на п.п. меню - "Чекнуть все".
imho
...
Рейтинг: 0 / 0
06.06.2017, 17:29
    #39467099
DNShark
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBoxTreeItem.checkBoxSelectionChangedEvent
Petro123,

Оно подторамживает, но не сильно, так как в потоках работает, но выполняется гораздо дольше положенного, глянул, всё таки нету флагов, запускается поток на каждый чек.
...
Рейтинг: 0 / 0
06.06.2017, 18:07
    #39467159
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBoxTreeItem.checkBoxSelectionChangedEvent
DNSharkОно подторамживает, но не сильно,
если без цифр, то так должно:
- чек-клик на ноде без дочек = моментально
- чек-клик на ноде с дочками = 2,3...10 сек. Зависит от ТЗ.
DNSharkвсё таки нету флагов, запускается поток на каждый чек.
вместо процедуры - вывод в лог + лог из таймера.
И дебагом ищи ошибку.
...
Рейтинг: 0 / 0
07.06.2017, 11:50
    #39467694
DNShark
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBoxTreeItem.checkBoxSelectionChangedEvent
Petro123,

время одной прорисовки порядка 0:00:00.005 - 0:00:00.033 sec. Запустил на 1000 нодах и комп ушел в небытие.

добавил флаг на проверку, если запущен - то не запускать. А в конце запуска еще проверку, если была проверка во время запуска, то еще раз запустить. (Так как сет чеков на первом и последнем запуске разный)

зависание ушло, правда 2 раза запускается теперь, но лучше чем 1000 раз ).
...
Рейтинг: 0 / 0
07.06.2017, 12:07
    #39467715
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBoxTreeItem.checkBoxSelectionChangedEvent
DNShark,
2 раза нормально.
...
Рейтинг: 0 / 0
13.06.2017, 12:03
    #39470842
DNShark
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBoxTreeItem.checkBoxSelectionChangedEvent
Petro123,

все таки OnClick есть, выглядит он так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
 treeView.addEventHandler(ActionEvent.ACTION, event -> check(event));


    private void check(ActionEvent event) {
        if (event.getTarget() instanceof CheckBox) {
            ...
        }
    }



срабатывает 1 раз
...
Рейтинг: 0 / 0
13.06.2017, 12:05
    #39470844
DNShark
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CheckBoxTreeItem.checkBoxSelectionChangedEvent
и немного кривоватое добытие TreeItem

Код: java
1.
TreeItem<Object> eventTreeItem = ((CheckBoxTreeCell<Object>) ((CheckBox) event.getTarget()).getParent()).getTreeItem();
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / CheckBoxTreeItem.checkBoxSelectionChangedEvent / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]