如何使AbstractListModel子类对Collection更改做出反应?

时间:2013-10-08 17:17:08

标签: java swing jlist

我有一个JList,我想用自己的ListModel提供它。我有一个包含条目的LinkedHashMap。我将AbstractListModel子类化。我想要实现的是,每当我从Map中删除一个元素时,我希望它反映在JList中(添加或删除元素甚至更新)。

编辑 - 我正在尝试这样做的场景如下:我有一个JList并添加,编辑和删除JButtons。我维护一个包含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);
        }


    }

请帮忙!

1 个答案:

答案 0 :(得分:2)

您应该使用模型并向模型添加值,而不是直接使用和向地图添加新值,模型负责将值添加到基础地图触发相应的事件刷新表视图:

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

请注意,在需要时可能更容易从检测器列表重建新地图,以避免维护两个并行集合。