Есть ли способ выделить строку в GlazedLists?

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

Есть ли способ выделить запись в GlazeLists?

1 ответ

Трудно быть уверенным, спрашиваете ли вы о том, как выделить новые элементы в списке, или буквально выделите строку в компоненте пользовательского интерфейса, поддерживаемого GlazedLists EventList,

А пока я приму первое, но не стесняюсь уточнить.

В пакете GlazedLists существует понятие ListEvents, позволяющее получить небольшой пик изменений, влияющих на список. Это не то, с чем я много играл, и это кажется довольно рудиментарным, но этот механизм можно использовать при определенных обстоятельствах.

Вот пример класса, который имеет BasicEventList содержащий несколько целых чисел. Я создал ListEventListener и прикрепил его к EventList, ListEvents сообщит вам, где был вставлен элемент. Он также содержит ссылку на список событий, поэтому можно получить вновь вставленное значение, а также значение элемента, предшествующего ему. Я делаю быстрое сравнение, чтобы увидеть, не в порядке ли они.

Конечно, здесь есть несколько важных предостережений. Обработка событий асинхронна, поэтому вполне возможно, что базовый список будет значительно изменяться между временем исходного триггера и временем, в которое слушатель обрабатывает событие. В моем примере это нормально, потому что я использую только операции добавления. Также я использую только BasicEventList; если бы это было SortedList тогда элементы будут вставлены в разные индексы, поэтому метод, который я использую для получения текущих и предыдущих значений, будет крайне ненадежным. (Могут быть способы обойти это, но я честно не применил себя к этой проблеме.)

По крайней мере, вы можете использовать слушателя, чтобы по крайней мере предупредить вас об изменении списка, и чтобы другой метод вне класса слушателя выполнил сканирование вашего списка, чтобы определить, есть ли элементы не в порядке.

import ca.odell.glazedlists.BasicEventList;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.GlazedLists;
import ca.odell.glazedlists.event.ListEvent;
import ca.odell.glazedlists.event.ListEventListener;

public class GlazedListListen {

    private final EventList<Integer> numbers = new BasicEventList<Integer>();

    public GlazedListListen() {

        numbers.addListEventListener(new MyEventListListener());

        numbers.addAll(GlazedLists.eventListOf(1,2,4,5,7,8));

    }

    class MyEventListListener implements ListEventListener<Integer> {
        @Override
        public void listChanged(ListEvent<Integer> le) {

            while (le.next()) {
                if (le.getType() == ListEvent.INSERT) {
                    final int startIndex = le.getBlockStartIndex();
                    if (startIndex == 0) continue; // Inserted at head of list - nothing to compare with to move on.

                    final Integer previousValue = le.getSourceList().get(startIndex-1);
                    final Integer newValue = le.getSourceList().get(startIndex);
                    System.out.println("INSERTING " + newValue + " at " + startIndex);
                    if ((newValue - previousValue) > 1) {
                        System.out.println("VALUE OUT OF SEQUENCE! " + newValue + " @ " + startIndex);
                    }
                }
            }
        }
    }

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

Примечание: я только протестировал против GlazedLists v1.8.

Другие вопросы по тегам