2015-01-16 5 views
0

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

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

ответ

0

Трудно быть уверенным в том, что вы спрашиваете о том, как выделять новые элементы в списке или буквально выделять строку в компоненте пользовательского интерфейса при поддержке 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.

+0

Да, это новый элемент, который я хочу выделить (или, возможно, покрасить его) каким-то образом. Спасибо за код .. Я посмотрю, как я нахожусь и обратная связь .. – user3914455