我有一个设计为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做了火灾的事情。 谢谢!现在我将重写它,所以它将是很好的代码。
答案 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);
}