2016-03-28 11 views
0

私はJavaプロジェクトでFirebaseを使用していますが、データを照会するリスナーを追加してからDefaultListModelに要素を追加しましたが、JListは古い項目のみを削除します新しいデータを表示します。
マイJListDefaultListModel.addElement()は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) { 
    } 
}); 
+0

のおかげだから 'usersData.removeAllElementsは、()'が実行されますか?しかし、あなたは 'for'ループに入ることはありませんか? –

+0

コンソールに 'userInfo'文字列が入っていないので、DefaultListModel' usersData'に新しい要素を追加しても 'JList'が更新されません。 – SaNtoRiaN

答えて

0

問題は私のリスナーの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)

1

usersDataは右の範囲ですか?私はそれがあなたのUI要素ではなく、メモリ内の情報を更新することと関係していると思っています。私たちに与えられたコードから、JListの情報を割り当てたり更新したりするのではなく、DefaultListModel <>を更新するだけです。試してみてください

+0

' DefaultListModel.addElement() 'の更新'JList'じゃない? – SaNtoRiaN

+0

私はそれを配列に追加すると思っていますが、それは以前のものに固執しているのでUI要素を変更しないでしょう - したがってあなたの問題です。 – mewc