java - 如何使 AbstractListModel 子类对 Collection 更改使用react?

标签 java swing jlist

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

编辑-我尝试执行此操作的场景如下:我有一个 JList 并添加、编辑和删除 JButton。我维护一个包含探测器对象的 map 。当我单击“添加”按钮时,我想向 map 添加一个新的检测器对象,同时我希望 JList 反射(reflect)在新的添加中。编辑和删除也是如此。

这是我到目前为止所做的,但我不知道如何使模型响应更新:

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);
        }


    }

请帮忙!

最佳答案

您应该使用模型并向模型添加值,而不是直接使用新值并向 map 添加新值,模型负责将值添加到底层 map 触发适当的事件刷新 TableView :

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

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

关于java - 如何使 AbstractListModel 子类对 Collection 更改使用react?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19254167/

相关文章:

java - 尝试从 Java 中的 Web 服务获取数据

java - 如何获取选定的 JScrollPane 元素?

java - 如何使用 swing 列出文件夹中的所有文件?

java - 使用ObjectOutputStream通过套接字发送多个文件

java - 使用 java.awt.Robot 输入字符串

java - setIcon 不适用于条件

java - Swing 中的 Action 监听器和事件源

java - usb4java USB 错误 4 : Unable to open USB device:

java - 为什么 Oracle 并行流教程使用新的 ArrayList<>(Arrays.asList(arr))?

Java GUI多项选择程序