【问题标题】:DefaultListModel.addElement() doesn't update JListDefaultListModel.addElement() 不更新 JList
【发布时间】:2016-07-15 22:58:32
【问题描述】:

我在我的 Java 项目中使用 Firebase,我添加了一个侦听器来查询数据,然后将元素添加到 DefaultListModelJList 仅删除旧项目并且不显示新数据。
我的JList

usersData = new DefaultListModel<>();
JList<String> users = new JList<>(usersData);
users.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
users.setSelectedIndex(0);
users.setVisibleRowCount(5);
JScrollPane fruitListScrollPane = new JScrollPane(users);
add(fruitListScrollPane, BorderLayout.SOUTH);

和我的 firebase 值监听器

firebaseRef.addListenerForSingleValueEvent(new ValueEventListener() {

    @Override
    public void onDataChange(DataSnapshot snapshot) {
        // remove all old elements from DefaultListModel
        usersData.removeAllElements();
        // get the data from snapshot
        for (DataSnapshot userSnapshot : snapshot.getChildren()) {
            User user = userSnapshot.getValue(User.class);
            String userInfo = "Username: " + user.getUsername() + " & Password: " + user.getPassword();
            // add the info to the model
            usersData.addElement(userInfo);
            // print the info
            System.out.println(userInfo);
        }
    }

    @Override
    public void onCancelled(FirebaseError error) {
    }
});

【问题讨论】:

  • 所以usersData.removeAllElements() 被执行了?但是你永远不会进入for循环?
  • 不,它会在控制台中输入并打印userInfo 字符串,问题是在我将新元素添加到 DefaultListModel usersData 后,JList 没有得到更新

标签: java firebase


【解决方案1】:

问题是我的listner 的oonDataChange() 在一个线程中运行,所以我使用这段代码来做我需要的事情。我将数据列表发送到此方法,然后开始一一添加。

public void addElements(final List<String> data) {
    if (SwingUtilities.isEventDispatchThread())
        return;
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            for (String item : data) {
                usersData.addElement(item);
                System.out.println(item);
            }
        }
    });
}

感谢Refreshing GUI by another thread in java (swing)

【讨论】:

    【解决方案2】:

    usersData 是正确的范围吗?我认为这与您更新内存中的信息有关,但与您的 UI 元素无关。从您给我们的代码中,您无需分配或刷新 JList 中的信息,只需更新 DefaultListModel。试试看

    【讨论】:

    • 我读到DefaultListModel.addElement() 更新了JList,不是吗?
    • 我相信它会将其添加到数组中,但不会更改 UI 元素,因为它会卡在以前的位置上 - 因此是您的问题。
    • 否,添加到列表模型确实会更新 UI。正是出于这个原因,UI 将自己注册到模型的 addListDataListener
    猜你喜欢
    • 2012-10-07
    • 1970-01-01
    • 2021-08-13
    • 2014-03-09
    • 2011-10-12
    • 2014-01-12
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多