0

JList があり、独自の ListModel を提供したいと考えています。エントリを含む LinkedHashMap があります。AbstractListModel をサブクラス化しました。私が達成したいのは、マップから要素を削除するたびに、それが JList に反映されるようにすることです (要素の追加または削除、さらには更新)。

編集-私がやろうとしていることのシナリオは次のとおりです。JListがあり、JButtonを追加、編集、および削除しますDetectors オブジェクトを含む Map を維持しています。追加ボタンをクリックすると、Map に新しい Detector オブジェクトを追加し、同時に JList を新しい追加に反映させたいと考えています。編集、削除も同様です。

これまでに作成したものは次のとおりですが、更新に対するモデルの応答を作成する方法がわかりません。

private class DetectorsListModel extends AbstractListModel {

        private List<Detector> detectors;
        private Map<Long, Detector> detectorsMap;

        public DetectorsListModel( Map<Long, Detector> detectorsMap) {
            this.detectorsMap = detectorsMap;
            detectors = new LinkedList<Detector>();
            for ( Long detectorID : detectorsMap.keySet() ) {
                detectors.add( detectorsMap.get(detectorID) );
            }
        }

        @Override
        public int getSize() {
            // TODO Auto-generated method stub
            return detectors.size();
        }

        @Override
        public Detector getElementAt(int index) {
            // TODO Auto-generated method stub
            return detectors.get(index);
        }


    }

助けてください!

4

1 に答える 1

2

新しい値を使用してマップに直接追加する代わりに、モデルを使用してモデルに値を追加する必要があります。モデルは、基になるマップに値を追加し適切なイベントを発生させてテーブル ビューを更新します。

public void add(Detector detector) {
    this.detectorsMap.put(detector.getId(), detector);
    this.detectors.add(detector);
    fireIntervalAdded(detectors.size() - 1, detectors.size() - 1);
}

2 つの並列コレクションを維持することを避けるために、必要に応じて検出器のリストから新しいマップを再構築する方がおそらく簡単であることに注意してください。

于 2013-10-08T18:04:54.740 に答える