Java 在我自己的模型中添加的FireInterval并不总是更新JList

Java 在我自己的模型中添加的FireInterval并不总是更新JList,java,swing,jlist,Java,Swing,Jlist,我有一个设计为MVC模式的程序,其中我的模型扩展了AbstractListModel。 将新用户添加到我的模型时,请使用以下代码: public synchronized void addUser(User u) { if (!users.contains(u)) { users.add(u); Collections.sort(users); //fire fireIntervalAdded(ListDataEvent.I

我有一个设计为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并非总是在更新。有时有效,有时无效。。。有线索吗?当然,im添加的用户总是添加到模型中,但是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(用户,u);
如果(指数<0){
int insertionPoint=-(索引+1);
添加(插入点,u);
fireIntervalAdded(此,insertionPoint,insertionPoint);
}

可能是同步问题吗?很可能
AbstractListModel
JList
没有任何问题。编辑:嗯。我刚刚删除了模型中的所有同步项。但是仍然是那个随机错误:(addUser方法是从另一个线程(不是swing线程)调用的。应该从EDT.Se my edit更新模型以获得答案:)thx!本文链接到一篇关于发现此类异常的技术的文章。
int index = Collections.binarySearch(users, u);
if(index < 0) {
  int insertionPoint = -(index + 1);
  users.add(insertionPoint, u);
  fireIntervalAdded(this, insertionPoint, insertionPoint);
}