【问题标题】:Sorting DefaultListModel排序 DefaultListModel
【发布时间】:2012-11-19 20:59:32
【问题描述】:

我想对我的DefaultListModel 进行排序并让它触发内容更改事件,但我坚持使用它,不明白如何调用它的 fireContentsChanged 方法。我看到,如果我的模型扩展AbstractListModel,我可以在排序后直接调用 fireContentsChanged,但是在我使用 DefaultListModel 上课的方式中,我不能调用它的 fireContentsChanged,因为它具有受保护的访问权限。我是否必须扩展AbstractListModel 或者有没有办法调用DefaultListModelfireContentsChanged?

public class DefaultDataModel implements DataModel 
{
  private DefaultListModel<Data> dataModel = new DefaultListModel<>();
  @Override
  public void addElement(Data data) {
    dataModel.addElement(data);
  }
  @Override
  public int getSize() {
    return dataModel.getSize();
  }
  @Override
  public Data getElementAt(int idx) {
    return dataModel.getElementAt(idx);
  }
  @Override
  public void addListDataListener(ListDataListener l) {
    dataModel.addListDataListener(l);
  }
  @Override
  public int indexOf(Data data) {
    return dataModel.indexOf(data);
  }
  @Override
  public List<Data> getAllData() {
    return Collections.list(dataModel.elements());
  }
  @Override
  public void sort() {
    Collections.sort(getAllData());
  }
}

【问题讨论】:

  • 您是要在对所有元素进行排序后调用“fireContentsChanged”方法,还是在排序过程中每次更改项目位置后调用“fireContentsChanged”方法?
  • 我不知道每次换位后都可以这样做。我认为在我的情况下,我只需要在所有元素都排序后调用 fireContentsChanged,但我不介意在每次更改项目位置后看看如何做。
  • 我知道这是旧的,但请注意 DefaultDataModel#sort() 方法不会修改 DefaultDataModel 或其委托 DefaultListModel 的元素的顺序。它将对 #getAllData() 构造的 List 进行排序,然后将其丢弃。

标签: java defaultlistmodel


【解决方案1】:

我在 sort 方法中找到了方法,我必须从 dataModel 侦听器列表中调用 contentsChanged 方法。

@Override
public void sort() {
    Collections.sort(getAllData());
    ListDataListener[] listeners = dataModel.getListDataListeners();
    for(ListDataListener listener : listener) {
        listener.contentsChanged(dataModel, ListDataEvent.CONTENTS_CHANGED, 0, getSize());
    }
}

【讨论】:

    猜你喜欢
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 2014-11-11
    相关资源
    最近更新 更多