2013-07-19 2 views
0

Я работаю в чате, используя smack и javafx. Итак, у меня есть табличное представление, в котором перечислены контакты зарегистрированного пользователя, и он получает статусы контактов в реальном времени, но когда пришло время обновлять таблицу, это не делает (даже жестко мой system.out .println показывает, что он должен был это сделать). Странно то, что он загружает данные только при первом загрузке таблицы. Вот мой код:Почему мой планшет не обновляется?

package login; 

import java.util.Collection; 
import java.util.Iterator; 

import org.jivesoftware.smack.Roster; 
import org.jivesoftware.smack.RosterEntry; 
import org.jivesoftware.smack.RosterGroup; 
import org.jivesoftware.smack.RosterListener; 
import org.jivesoftware.smack.XMPPConnection; 
import org.jivesoftware.smack.packet.Presence; 

import dto.RosterDTO; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.collections.FXCollections; 
import javafx.collections.ListChangeListener; 
import javafx.collections.ObservableList; 
import javafx.event.*; 
import javafx.fxml.FXML; 
import javafx.scene.control.*; 
import javafx.scene.control.cell.PropertyValueFactory; 

/** Controls the main application screen */ 
public class MainViewController { 
    @FXML 
    private Button logoutButton; 
    @FXML 
    private Label sessionLabel; 

    @FXML 
    private TableView<RosterDTO> rosterTable; 
    @FXML 
    private TableColumn<RosterDTO, String> grupoColumn; 
    @FXML 
    private TableColumn<RosterDTO, String> usuarioColumn; 
    @FXML 
    private TableColumn<RosterDTO, String> estatusColumn; 

    ObservableList<RosterDTO> rosterList; 

    private LoginManager loginManager; 

    @FXML 
    private void initialize() { 
     // Initialize the person table 
     grupoColumn 
       .setCellValueFactory(new PropertyValueFactory<RosterDTO, String>(
         "grupo")); 
     usuarioColumn 
       .setCellValueFactory(new PropertyValueFactory<RosterDTO, String>(
         "usuario")); 
     estatusColumn 
     .setCellValueFactory(new PropertyValueFactory<RosterDTO, String>(
       "estatus"));   
     rosterTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); 
    } 

    public void initSessionID(final LoginManager loginManager, String sessionID) { 
     this.loginManager = loginManager; 
     XMPPConnection connection = this.loginManager.getXmppManager().getConnection(); 
     Roster roster = connection.getRoster(); 
     Collection<RosterEntry> entries = roster.getEntries(); 
     Presence p = roster.getPresence("testUser1"); 
     System.out.println("Estatus: " + p.getStatus()); 
     System.out.println("\n\n" + entries.size() + " buddy(ies):"); 
     rosterList = FXCollections.observableArrayList(); 
     for (RosterEntry r : entries) { 
      RosterDTO rosterDTO = new RosterDTO(); 
      rosterDTO.setUsuario(r.getUser() + "/Smack"); 
      System.out.println("user: " + r.getUser()); 
      System.out.println(r.getName()); 
      System.out.println("group: " + r.getGroups()); 
      for (Iterator<?> i = r.getGroups().iterator(); i.hasNext();) { 
       RosterGroup rosterObject = (RosterGroup) i.next(); 
       rosterDTO.setGrupo(rosterObject.getName()); 
      } 
      rosterList.add(rosterDTO); 
     } 
     rosterTable.setItems(rosterList); 
     roster.addRosterListener(new RosterListener() { 
      public void entriesDeleted(Collection<String> addresses) { 
       System.out.println("deleted: " + addresses.size()); 
      } 

      public void entriesUpdated(Collection<String> addresses) { 
       System.out.println("updated: " + addresses.size()); 
      } 

      public void entriesAdded(Collection<String> addresses) { 
       System.out.println("added: " + addresses.size()); 
      } 

      public void presenceChanged(Presence presence) { 
       System.out.println("Presence changed: " + presence.getFrom() 
         + " " + presence + " " + presence.getStatus()); 
       System.out.println(presence.getProperty("key")); 
       rosterList.get(0).setUsuario(presence.getStatus()); 
       rosterList.get(0).setEstatus(presence.getStatus()); 
       //rosterTable.setUserData(rosterList); 
       rosterTable.layout(); 
       rosterTable.setItems(rosterList); 
      } 
     });  

    } 
} 

Почему загрузка данных 1-й раз, но не позже? Должен ли я использовать что-то еще, кроме таблицы? Спасибо заранее.

+0

Так что не работает? Метод containsChanged? Вы реализовали usarioProperty() и estatusProperty() в RosterDTO, как требуется PropertyValueFactory, чтобы получить изменения свойств объекта модели? – jewelsea

+0

нет Мне это не удалось решить, добавив \t \t \t \t \t \t element.setUsuario (rosterList.get (i) .getUsuario()); \t \t \t \t rosterList.set (i, element); поэтому я изменяю список ростеров с помощью набора методов – linker85

ответ

0

Ive удалось решить с помощью метода «набор» из моего списка наблюдаемых , так что я оставил свой метод, как это:

public final void displayBuddyList(final TableView<RosterDTO> rosterTable) { 
     Roster roster = connection.getRoster(); 
     Collection<RosterEntry> entries = roster.getEntries(); 
     System.out.println("\n\n" + entries.size() + " buddy(ies):"); 
     final ObservableList<RosterDTO> rosterList = FXCollections.observableArrayList(); 
     for (RosterEntry r : entries) { 
      RosterDTO rosterDTO = new RosterDTO(); 
      rosterDTO.setUsuario(r.getUser() + "/Smack"); 
      System.out.println("user: " + r.getUser()); 
      System.out.println(r.getName()); 
      System.out.println("group: " + r.getGroups()); 
      for (Iterator<?> i = r.getGroups().iterator(); i.hasNext();) { 
       RosterGroup rosterObject = (RosterGroup) i.next(); 
       rosterDTO.setGrupo(rosterObject.getName()); 
      } 
      rosterList.add(rosterDTO); 
     } 
     rosterTable.setItems(rosterList); 
     roster.addRosterListener(new RosterListener() { 
      // Ignored events public void entriesAdded(Collection<String> 
      // addresses) {} 
      public void entriesDeleted(Collection<String> addresses) { 
       System.out.println("deleted: " + addresses.size()); 
      } 

      public void entriesUpdated(Collection<String> addresses) { 
       System.out.println("updated: " + addresses.size()); 
      } 

      public void entriesAdded(Collection<String> addresses) { 
       System.out.println("added: " + addresses.size()); 
      } 

      public void presenceChanged(Presence presence) { 
       int i = 0; 
       for(RosterDTO rdto : rosterList) { 
        if (rdto.getUsuario().equals(presence.getFrom())) { 
         RosterDTO element = new RosterDTO(); 
         element.setEstatus("" + presence); 
         element.setUsuario(rosterList.get(i).getUsuario()); 
         rosterList.set(i, element); 
        } 
        i++; 
       } 
       System.out.println("ch: " + rosterList.toString()); 
      } 
     }); 
    } 
Смежные вопросы