首页 > 解决方案 > Java 聊天 - 更新 Java FX 中不同列表视图的消息

问题描述

我正在尝试使用不同的 observableLists(一个 observableList = 一个聊天)更新 listView,并且消息应该动态显示。它适用于第一次单击的聊天 - 当我更改聊天时 - 一些消息出现在 BAD 聊天中 - 在不同的 observableList 中。我想——当我打电话时messageRenderingService.restart();——它会用新参数再次启动这个服务,但它没有按预期工作。

public class Controller extends AbstractController implements Initializable {

private Client client;
private Client selectedClient;
private ObservableList<String> observableList = FXCollections.emptyObservableList();

@FXML
private TreeView<Client> treeView;
private TreeItem<Client> root  = new TreeItem<Client>();

@FXML
private ListView<String> mainChat;

List<ListView<String>> listViews = new ArrayList<>();

@FXML
private TextField sendField;

@FXML
void sendMessage(ActionEvent event) {
    String msg = sendField.getText();
    if(msg != null){
        client.sendMessage(new Message(ServerProtocols.PRIVATE, selectedClient.getId(), selectedClient.getName(), msg));
    }
}

public Controller(AccessData accessData) {
    super(accessData);
}

@Override
public void initialize(URL location, ResourceBundle resources) {
    client = getAccessData().getActiveClient();

    treeView.setRoot(root);

    root.setExpanded(true);

    OnlineUsersService onlineUsersService = new OnlineUsersService(client, root, getAccessData(), selectedClient);
    onlineUsersService.start(); 

    treeView.setOnMouseClicked(e -> {
        selectedClient = treeView.getSelectionModel().getSelectedItem().getValue();
        if(selectedClient != null){
            getAccessData().addChat(client.getId(), selectedClient.getId());
            ObservableList<String> chat = getAccessData().getActiveChat();
            System.out.println("Active chat is..." +  chat);
            MessageCheckingService messageCheckingService = new MessageCheckingService(client, getAccessData().getActiveChat(), mainChat);
            messageCheckingService.restart();
        }
    });


}

}

public class AccessData {

private Client activeClient;
private ObservableList<String> activeChat;

private Map<String, ObservableList<String>> chats = new HashMap<>();


public Client getActiveClient() {
    return activeClient;
}

public void setActiveClient(Client activeClient) {
    this.activeClient = activeClient;
}

public ObservableList<String> getChat(int id1, int id2) {
    String value = convertChatID(id1, id2);
    System.out.println("CHCI CHAT S ID " + value);
    if (chats.containsKey(value)) {
        return chats.get(value);
    }
    return null;
}

public void addChat(int id1, int id2) {
    String value = convertChatID(id1, id2);
    System.out.println("Nastavuji view---" + value);
    if (!chats.containsKey(value)) {
        ObservableList<String> chat = FXCollections.observableArrayList();
        System.out.println("VKLÁDÁM " + value + " - " + chat);
        chats.put(value, chat);
        setActiveChat(chat);
    } else {
        System.out.println("Chat alredy IN");
        setActiveChat(chats.get(value));
    }
}

public ObservableList<String> getActiveChat(){
    return activeChat;
}

public void setActiveChat(ObservableList<String> chat) {
    this.activeChat = chat;
}

private String convertChatID(int id1, int id2) {
    String value = "";
    // 1; 2
    // 2; 1
    if (id1 < id2) {
        value = id1 + "" + id2;
    } else if (id1 > id2) {
        value = id2 + "" + id1;
    }
    return value;
}

}

public class MessageCheckingService extends Service<Void> {

private ListView<String> listView;
private Client client;
private ObservableList<String> messages;

public MessageCheckingService(Client client,ObservableList<String> observableList, ListView<String> listView){
    this.client = client;
    this.messages = observableList;
    this.listView = listView;

    listView.setItems(messages);
}

@Override
protected Task<Void> createTask() {
    System.out.println("STARTING NEW MESSAGECHECKING SERVICE!");
    return new Task<Void>() {
        @Override
        protected Void call() throws Exception {
            while(true){
                Message m = client.getLastMessage();
                System.out.println("MESSAGE " + m.getMessage());
                Platform.runLater(() -> {
                    messages.add(m.getMessage());
                });
                System.out.println("OBSERVABLE LIST IN MESSAGESERVICE" + messages);
            }
        }
    };
}

}

标签: javasocketslistviewjavafxservice

解决方案


推荐阅读