【问题标题】:How to make an AbstractListModel subclass react to a Collection change?如何使 AbstractListModel 子类对 Collection 更改做出反应?
【发布时间】:2013-10-08 17:17:07
【问题描述】:

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

EDIT- 我尝试这样做的场景如下:我有一个 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);
        }


    }

请帮忙!

【问题讨论】:

  • 您需要调用 AbstractListModel 的相应 fireXXX 方法。
  • 我在您的代码中没有看到任何 JList。也就是说,假设您在示例中实际上是指List,只是不要直接访问您的Map。这样,任何对您的DetectorsListModel 的调用以更新地图都可以以相同的方法更新List
  • 而您的 XxxListModel 不完整,请在此处搜索帖子java+swing+jlist+abstractlistmodel
  • @camickr 你能看看我的编辑吗?
  • 您的模型需要具有添加/删除方法,当您单击按钮时会调用这些方法。然后模型更新 Map 并调用适当的 fireXXX 方法。我不打算为你编写代码。上次我给你答复 (stackoverflow.com/questions/19212232/…) 时,你不欣赏帮助。

标签: java swing jlist


【解决方案1】:

您应该使用模型并将值添加到模型,而不是直接使用和添加新值到地图,模型负责将值添加到底层地图触发适当的事件刷新表格视图:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 2020-02-03
    • 2020-06-15
    • 2015-12-30
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    相关资源
    最近更新 更多