powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / магия Java FX8 или.. (ListView)
10 сообщений из 10, страница 1 из 1
магия Java FX8 или.. (ListView)
    #38743140
danatriel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все доброго дня.
После перевода проекта на 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
магия Java FX8 или.. (ListView)
    #38743196
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, так ключевая проблема в цепочке
r.setFilter(p1); -> ListChangeListener.onChanged()
её и надо дебажить
как реализован setFilter() ?
...
Рейтинг: 0 / 0
магия Java FX8 или.. (ListView)
    #38743210
danatriel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
магия Java FX8 или.. (ListView)
    #38743243
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
магия Java FX8 или.. (ListView)
    #38743250
danatriel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

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

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

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

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

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


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