Java 如何使AbstractListModel子类对集合更改作出反应?

Java 如何使AbstractListModel子类对集合更改作出反应?,java,swing,jlist,Java,Swing,Jlist,我有一个JList,我想为它提供我自己的ListModel。我有一个包含条目的LinkedHashMap。我对AbstractListModel进行了子类化。我想要实现的是,每当我从映射中删除一个元素时,我都希望它反映在JList中(添加或删除元素,甚至更新) 编辑-我尝试这样做的场景如下:我有一个JList,可以添加、编辑和删除JButtons。我维护一个包含探测器对象的地图。单击“添加”按钮时,我希望向地图添加一个新的探测器对象,同时希望JList通过新的添加反映出来。编辑和删除也一样 以下

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

编辑-我尝试这样做的场景如下:我有一个JList,可以添加、编辑和删除JButtons。我维护一个包含探测器对象的地图。单击“添加”按钮时,我希望向地图添加一个新的探测器对象,同时希望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);
        }


    }
private class detectorsModel扩展了AbstractListModel{
私人名单探测器;
专用地图检测器;
公共DetectorsModel(地图detectorsMap){
this.detectorsMap=detectorsMap;
检测器=新的LinkedList();
for(长检测器ID:detectorsMap.keySet()){
detectors.add(detectorsMap.get(detectorID));
}
}
@凌驾
公共int getSize(){
//TODO自动生成的方法存根
返回检测器。尺寸();
}
@凌驾
公共检测器getElementAt(内部索引){
//TODO自动生成的方法存根
返回检测器。获取(索引);
}
}

请帮忙

不应直接使用映射并向映射添加新值,而应使用模型并向模型添加值,该模型负责向基础映射添加值,并触发相应的事件以刷新表视图:

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

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

您需要调用AbstractListModel的相应fireXXX方法。我在代码中没有看到任何
JList
。也就是说,假设您在示例中实际指的是
列表
,只是不要直接访问
地图
。这样,任何调用您的
DetectorsListModel
来更新地图的调用都可以用相同的方法更新
列表。如果您的XxxListModel未完成,请在post@camickr中搜索此处。您可以查看我的编辑吗?您的模型需要有添加/删除方法,您可以在单击按钮时调用这些方法。然后模型更新映射并调用适当的fireXXX方法。我不打算为你写代码。上次我给你答复时,你没有感激我的帮助。