DefaultListModel.addElement()不更新JList

时间:2016-03-28 16:29:28

标签: java firebase

我在我的Java项目中使用Firebase,我已经添加了一个监听器来查询数据,然后将元素添加到DefaultListModel,但JList只删除旧项目并且不会#39; t显示新数据。
我的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) {
    }
});

2 个答案:

答案 0 :(得分:1)

是usersData的正确范围吗?我认为它与你更新内存中的信息有关,而不是你的UI元素。从你给我们的代码中,你不要在JList中分配或刷新信息,只需更新DefaultListModel&lt;&gt;。试试那个

答案 1 :(得分:0)

问题是我的列表管理器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); } } }); } 在一个线程中运行,因此我使用此代码来执行我需要的操作。我将数据列表发送到此方法,然后开始逐个添加它们。

 [Dapper.Key]
 [Required(ErrorMessage = "This field is requierd")]
 [Range(1, int.MaxValue, ErrorMessage ="Only Int")]
 public int? Tic_Id { get; set; }

 [Required(ErrorMessage = "This field is requierd")]
 public DateTime Tic_Date { get; set; }

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