java - 我自己的模型中添加的 fireInterval 并不总是更新 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.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/

相关文章:

java - 如何从 javascumbs 迁移到 springframework-ws-test

java - 如何修复Spring数据中的 'ERROR: Incorrect DATETIME value: %%'?

java - 有人可以解释一下代码吗?

java - JTree中如何扩展到特定的TreeNode

java - JList 的 TransferHandler.createTransferable() 和 .exportDone() 未调用

java - 检查日历日期是否为星期日

java - 将组件直接添加到 JFrame 中,还是将它们放在 JPanel 中?

java - 如何在表格/面板/JFrame 中使用 SWING/JButton 正确定位按钮

java - 里面有 3 个 JLabel 的 JList

java - GUI actionPerformed valueChanged 问题