0

厳密に昇順の数値シーケンスで特定のエンティティの到着を監視するために使用されるリストがあり、シーケンスに明らかな中断があるエントリを表示したいと考えています。

s のエントリを強調表示する方法はありますGlazeListか?

4

1 に答える 1

0

リスト内の新しい要素を強調表示する方法について尋ねているのか、それとも GlazedLists によってサポートされている UI コンポーネントの行を文字通り強調表示する方法について質問しているのかを確認するのは困難です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 に対してのみテストしました。

于 2015-01-19T17:00:37.257 に答える