【问题标题】:fireIntervalAdded in my own Model doesnt allways update JList在我自己的模型中添加的 fireInterval 并不总是更新 JList
【发布时间】: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 引起了火灾。 谢谢!现在我将重写它,这样它也将是很好的代码。

【问题讨论】:

  • 会不会是同步问题? AbstractListModelJList 可能没有问题。
  • 编辑:嗯。我刚刚删除了模型中的每个同步。但仍然是那个随机错误:( addUser 方法是从另一个线程(不是摆动线程)调用的。
  • 模型应该从 EDT 更新。
  • 请查看我对答案的编辑 :) thx!
  • Q&A 链接到有关发现此类异常的技术的文章。

标签: java swing jlist


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 2020-09-10
    相关资源
    最近更新 更多