我有一个设计为 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 引起了火灾。 谢谢!现在我将重写它,这样它也将是很好的代码。
最佳答案
除了 EDT 问题之外,您还触发了错误的索引。假设用户已经排序,您将需要类似以下内容(全部在 EDT 上,而不仅仅是事件的触发!):
int index = Collections.binarySearch(users, u);
if(index < 0) {
int insertionPoint = -(index + 1);
users.add(insertionPoint, u);
fireIntervalAdded(this, insertionPoint, insertionPoint);
}
关于java - 我自己的模型中添加的 fireInterval 并不总是更新 JList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7811756/