Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / магия Java FX8 или.. (ListView) / 10 сообщений из 10, страница 1 из 1
10.09.2014, 15:30
    #38743140
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
магия Java FX8 или.. (ListView)
Все доброго дня.
После перевода проекта на Java 8 стал наблюдать интересную проблему, решение которой не могу найти.

Код: 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.
public class Reference<T extends DatabaseEntity> implements ObservableList<T>, Externalizable {
    private ObservableList<T> ref = new utils.ObservableList<>();
    private ObservableList<T> filtered = FXCollections.observableArrayList();

    @Override
    public int size() {
        if (filter.get() != null) {
            return filtered.size();
        }
        return ref.size();
    }
    @Override
    public T get(int index) {
        try {
            if (filter.get() != null) {
                return filtered.get(index);
            }
            return ref.get(index);
        } catch (java.lang.ArrayIndexOutOfBoundsException ex) {
            throw  new ArrayIndexOutOfBoundsException(index);

        }
    }
....
}



класс Reference переопределяет ObservableList. Выводит либо ref, либо filtered - если не пустой.
Есть
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
ListView<Personal> list=new ListView();
Personal p1=new Personal("p1");
Personal p2=new Personal("p2");
Reference<Personal> r=new  Rerefence();
r.addAll(p1,p2);

list.setItems(r);

//в ListView отобразилось 2 элемента

//далее вешаем фильтр на список, чтобы в списке остался 1 элемент
r.setFilter(p1);
//т.о. r содержит элемент p1
//ListView сам не обновился

//А тут внимание! в Java 7 выполнял:
//list.setItems(null);
//list.setItems(r);
//и данные в списке обновлялись, а теперь в списке остаются обе строки, 
//НО, вторая строка не доступна, то есть ее ни выделить, ничего с ней не сделать.
//и сам ListView содержит список с 1 элементом.


Вопрос: как избавиться от фантомной записи в ListView? Заранее благодарю
...
Рейтинг: 0 / 0
10.09.2014, 16:02
    #38743196
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
магия Java FX8 или.. (ListView)
Ну, так ключевая проблема в цепочке
r.setFilter(p1); -> ListChangeListener.onChanged()
её и надо дебажить
как реализован setFilter() ?
...
Рейтинг: 0 / 0
10.09.2014, 16:09
    #38743210
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
магия Java FX8 или.. (ListView)
Blazkowicz,
Код: 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.
    public void setFilter(FilterRef filter) {
        this.filter.set(filter);
    }
    ChangeListener<FilterRef> filterListener = new ChangeListener<FilterRef>() {

        @Override
        public void changed(ObservableValue<? extends FilterRef> ov, FilterRef t, FilterRef t1) {
            filtered.clear();
      
                if (t1 == null) {
                    return;
                }
                for (T item : ref) {
                    try {
                        Object invoke = t1.getterMethod().invoke(item);
                        if (t1.getValue() instanceof Collection) {
                            Collection col = (Collection) t1.getValue();
                            for (Object obj : col) {
                                if (invoke != null && invoke.equals(obj)) {
                                    filtered.add(item);
                                    break;
                                }
                            }
                        } else {
                            if (invoke != null && invoke.equals(t1.getValue())) {
                                filtered.add(item);
                            }
                        }
                    } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
                        Logger.getLogger(Reference.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        };
    {
        filter.addListener(new WeakChangeListener<>(filterListener));



В том то и дело, что в данных все красиво, и после list.setItems(r); в методе list.getItems(); я вижу только 1 элемент. Так же при попытке list.getItems().remove(1); что не удивительно выпадает исключение.

В самом Reference я переопределил все методы списка, чтобы они возвращали значения из нужного списка (или ref или filtered)
...
Рейтинг: 0 / 0
10.09.2014, 16:23
    #38743243
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
магия Java FX8 или.. (ListView)
danatrielВ том то и дело, что в данных все красиво, и после list.setItems(r); в методе list.getItems(); я вижу только 1 элемент.
Это данные. А события не видно! При изменении фильтра нужно собщить слушателям списка, что список изменился. Где это происходит?
ListView вешает своего слушаетеля на Reference вот в этой строке
Код: java
1.
list.setItems(r);


Вопрос. Как именно метод setFilter() вызывает этого слушателя?

Я так думаю, что стоило иметь что-то такое:
Код: java
1.
2.
3.
4.
5.
6.
class Reference<T extends DatabaseEntity> extends ObservableListBase<T>{
    public void setFilter(FilterRef filter) {
        ListChangeListener.Change change = applyFilter(filter);
        fireChange(change)
    }  
}

applyFilter - это ваш метод, который реализует фильтрацию, но как результат возвращает данные о том что и как отфильтровалось.
Пихать сложную логику в анонимные классы и лямбды считаю ошибочным стилем.
...
Рейтинг: 0 / 0
10.09.2014, 16:27
    #38743250
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
магия Java FX8 или.. (ListView)
Blazkowicz,

спасибо, вроде разобрался. Слушатель на filtered не вешается, в этом то и ошибка наверно
...
Рейтинг: 0 / 0
10.09.2014, 16:42
    #38743278
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
магия Java FX8 или.. (ListView)
danatrielспасибо, вроде разобрался. Слушатель на filtered не вешается, в этом то и ошибка наверно
Нет. Ошибка в том что класс декларирует что он ObservableList, но фактически ничего для реализации именно Observable не делает.
Меня сильно смущает попытка показывать либо один либо другой список. Так как реализации size\get не достаточно. Нужно правильно делегировать и другие методы. Особенно те которые связаны с событиями. Поэтому я такой задумки не понимаю совершенно.

ИМХО, ListView должен всегда показывать filteredList, а тот должен уже быть отображением referenceList либо полным, либо урезаным. Такое решени, ИМХО было бы намного проще.
...
Рейтинг: 0 / 0
10.09.2014, 16:45
    #38743283
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
магия Java FX8 или.. (ListView)
...
Рейтинг: 0 / 0
10.09.2014, 16:47
    #38743289
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
магия Java FX8 или.. (ListView)
Blazkowicz,

я пробовал в ListView передавать и filtered - результата так же не было
...
Рейтинг: 0 / 0
10.09.2014, 16:50
    #38743294
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
магия Java FX8 или.. (ListView)
Blazkowicz,

но Reference переделаю по Вашему совету, спасибо!
...
Рейтинг: 0 / 0
11.09.2014, 11:03
    #38743919
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
магия Java FX8 или.. (ListView)
Blazkowicz,

День добрый!
А проблема то была вообще банальной, как оказалось, у меня CellFactory был не дописан, вот он и не убирал фантомные строки:), а так все работало, но тем не менее, во время поиска этой глупости я перевел отображение справочников на FilteredList, что нравится мне на много больше :)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / магия Java FX8 или.. (ListView) / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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