我自己的Model中的fireIntervalAdded并不总是更新JList

时间:2011-10-18 18:10:03

标签: java swing jlist

我有一个设计为MVC模式的程序,我的模型扩展了AbstractListModel。 当我向我的模型添加新用户时,请使用以下代码:

public synchronized void addUser(User u) {
    if (!users.contains(u)) {
        users.add(u);
        Collections.sort(users);
        //fire
        fireIntervalAdded(ListDataEvent.INTERVAL_ADDED, getSize(), getSize());
    }
}

有时,它运作正常。但是JList并不总是在更新。有时候它有效,有时候没有...任何线索?当然,添加的用户总是被添加到模型中,但fireIntervalAdded / JList有错误

编辑:如果我将代码更改为以下内容:

public void addUser(final User u) {
    if (!users.contains(u)) {
        users.add(u);
        Collections.sort(users);
    }
    EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
        fireIntervalAdded(this, getSize(), getSize());
        }
    });
}

它完美无缺。所以问题在于它不是EDT做了火灾的事情。 谢谢!现在我将重写它,所以它将是很好的代码。

1 个答案:

答案 0 :(得分:2)

除了EDT问题,你正在触发错误的索引。假设用户已经排序,您将需要类似以下内容(所有这些都在EDT上,而不仅仅是事件的触发!):

int index = Collections.binarySearch(users, u);
if(index < 0) {
  int insertionPoint = -(index + 1);
  users.add(insertionPoint, u);
  fireIntervalAdded(this, insertionPoint, insertionPoint);
}