【发布时间】:2011-10-18 18:10:03
【问题描述】:
我有一个设计为 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 引起了火灾。 谢谢!现在我将重写它,这样它也将是很好的代码。
【问题讨论】:
-
会不会是同步问题?
AbstractListModel或JList可能没有问题。 -
编辑:嗯。我刚刚删除了模型中的每个同步。但仍然是那个随机错误:( addUser 方法是从另一个线程(不是摆动线程)调用的。
-
模型应该从 EDT 更新。
-
请查看我对答案的编辑 :) thx!
-
此Q&A 链接到有关发现此类异常的技术的文章。