我有一个列表,用于监视某些实体在严格升序的数字序列中的到达,并希望显示序列中存在明显中断的条目。
有没有办法突出显示GlazeList
中的条目?
答案 0 :(得分:0)
很难确定您是否询问如何在列表中突出显示新元素,或者在GlazedLists EventList
支持的UI组件中突出显示一行。< / p>
现在我假设前者,但随时可以澄清。
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进行了测试。