2013-10-08 56 views
0

我有一個JList,我想用自己的ListModel提供它。我有一個包含條目的LinkedHashMap。我分類了AbstractListModel。我想要實現的是每當我從Map中移除一個元素時,我都希望將它反映到JList中(添加或移除元素或更新)。如何使AbstractListModel子類對集合更改做出反應?

EDIT-我試圖這樣做的場景如下:我有一個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); 
     } 


    } 

請幫幫忙!

+1

您需要調用AbstractListModel的相應fireXXX方法。 – camickr

+0

我的代碼中沒有看到任何'JList'。這就是說,假設你在你的例子中實際上是指'List',那就不要直接訪問你的'Map'。這樣任何調用你的'DetectorsListModel'來更新地圖都可以用同樣的方法更新'List'。 – StormeHawke

+0

和你的XxxListModel不完整,在這裏搜索[java + swing + jlist + abstractlistmodel](http://stackoverflow.com/search?tab=newest&q= [java]%20 [swing]%20 [jlist] %20abstractlistmodel) – mKorbel

回答

2

您應該使用模型並將值添加到模型中,而不是直接使用並向地圖添加新值,該模型負責將值添加到底層地圖觸發適當的事件以刷新表格查看:

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

請注意,在需要時從檢測器列表重建新映射可能更容易,以避免維護兩個並行集合。

相關問題