2016-11-16 11 views
0

私は現在チャットアプリケーションを開発しています.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コントローラでは、ObservableMapChatCustomManagerListener.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を定義するには?

答えて

0

ObservableMapは、それ自身が変更されたときのみ変更を見ることができます。したがって、バッキング・マップを変更すると、その変更について通知されません。

ChatCustomManagerListenerを変更して、ObservableMapオブジェクトを介してチャットを追加する必要があります。

+0

ChatCustomManagerListener内のマップを観測可能なものとして定義し、コントローラ内のマップを取得してonChangeListenerのコンフォーメーションをここで定義するとどうなりますか?これは可能ですか?例えば、 'initComponents'の –

+0

は' ChatCustomManagerListener.getObservableMap()。addListener(new MapChangeListener(){}); ' –

+0

を持っています。限り、元の地図を直接編集する方法はありません。 – Kiskae

関連する問題