0

私は smack と javafx を使用してチャットクライアントに取り組んでいます。そのため、ログに記録されたユーザーの連絡先を一覧表示するテーブルビューがあり、連絡先のステータスをリアルタイムで取得しますが、テーブルビューを更新するときにそれを行いません (system.out.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);
            }
        });     

    }
}

初めてデータをロードするのに、後でロードしないのはなぜですか? テーブルビュー以外のものを使用する必要がありますか? 前もって感謝します。

4

1 に答える 1