Есть ли способ выделить строку в GlazedLists?
У меня есть список, который используется для отслеживания прибытия определенных объектов в строго возрастающей числовой последовательности, и я хочу отобразить запись, в которой есть очевидный разрыв в последовательности.
Есть ли способ выделить запись в GlazeList
s?
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.