私は現在チャットアプリケーションを開発しています.GoogleコントローラにObservables Collectionsを用意して、受信したメッセージを管理できるようにします。新しいチャットのためJavaでObservableMapを正しく使用する方法
リスナー:新しいメッセージの
class ChatCustomManagerListener {
private static HashMap <Chat, ChatCustomMessageListener> chatsTable;
/*
* This is the event that gets triggered when new chat is created
*/
public void chatCreated (Chat newChat) {
ChatCustomMessageListener listener = new ChatCustomMessageListener();
newChat.addListener (listener);
chatsTable.put (newChat, listener);
}
}
リスナー
だから、私は、サーバーから来て、私は新しいメッセージを聞くこのリスナーを持っている。具体的には:
class ChatCustomMessageListener {
private List <Message> messagesQueue;
public ChatCustomMessageListener() {
//QueuedLinkedList is my extension of LinkedList class
//add() is made at the tail of List
//get() returns the head of list
messagesQueue = new QueuedLinkedList();
}
/*
* This is the event that gets triggered when a new message is received
*/
public void processMessage (Chat chat, Message message) {
messagesQueue.add (message);
}
}
私のGUIコントローラでは、ObservableMap
ChatCustomManagerListener.chatsTable
変化をしてchatsTable内の各Entry
を探すために、私はChatCustomMessageListener.messagesQueue
が、動作していないためObservableList
を持ちたいがこれです:
class ChatController {
private ObservableMap <Chat, ChatCustomMessageListener> chatsObserver;
private LinkedList <ObservableList <Message>> messagesObservables;
private LinkedList <List <Message>> messageData;
private void initObservables() {
chatsObserver = FXCollections.observableMap (ChatCustomManagerListener.getChats());
messageData = new LinkedList <>();
messagesObservables = new LinkedList <>();
chatsObserver.forEach ((chat, messageListener) -> {
messageData.add (messageListener.getMessagesQueue());
});
messageData.forEach ((queueOfMessages) -> {
ObservableList <Message> observer = FXCollections.observableList (queueOfMessages);
observer.addListener (new ListChangeListener <Message>() {
@Override
public void onChanged (javafx.collections.ListChangeListener.Change <? extends Message> c)
log.debug ("New message was received");
}
});
messagesObservables.add (observer);
});
chatsObserver.addListener (new MapChangeListener <Chat, ChatCustomMessageListener>() {
@Override
public void onChanged (
javafx.collections.MapChangeListener.Change <? extends Chat, ? extends ChatCustomMessageListener> change) {
//define what is done when a new chat is created
log.debug ("New chat was created");
}
});
}}
だから、正しい方法は何ですかObservablesを定義するには?
ChatCustomManagerListener内のマップを観測可能なものとして定義し、コントローラ内のマップを取得してonChangeListenerのコンフォーメーションをここで定義するとどうなりますか?これは可能ですか?例えば、 'initComponents'の –
は' ChatCustomManagerListener.getObservableMap()。addListener(new MapChangeListener(){}); ' –
を持っています。限り、元の地図を直接編集する方法はありません。 – Kiskae