Я работаю в чате, используя 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-й раз, но не позже? Должен ли я использовать что-то еще, кроме таблицы? Спасибо заранее.
Так что не работает? Метод containsChanged? Вы реализовали usarioProperty() и estatusProperty() в RosterDTO, как требуется PropertyValueFactory, чтобы получить изменения свойств объекта модели? – jewelsea
нет Мне это не удалось решить, добавив \t \t \t \t \t \t element.setUsuario (rosterList.get (i) .getUsuario()); \t \t \t \t rosterList.set (i, element); поэтому я изменяю список ростеров с помощью набора методов – linker85