类似QQ 的一个项目,MainFrame中抛出了一个线程监听了一个端口,双击MainFrame中的一个客户,弹出对话窗口可以输入Message,点击发送按钮可以通过DatagrameSocket(UDP)发包给指定的客户,问题是这样的:我们使用QQ时在同一个MessageFrame中写文本然后发送,当收到对方的消息时,程序并不是再弹出一个窗口显示对方发过来的消息,而是在刚刚我们发送文本的那个MessageFrame中显示,然而当我们关闭了这个MessageFrame后,程序才会另外弹出一个窗口来显示对方发出的消息,而且当用户很多时,还要判断每一个MessageFrame对应的客户。感觉实现起来很麻烦阿……,望赐教

解决方案 »

  1.   

    这个不是Java的问题,是设计的问题啊。
      

  2.   

    声明一个静态的公有HashMap map每个用户应该有一个唯一的身份标识,这里就假设为ID吧,HashMap中以ID为key,以该用户对应的MessageFrame为value。对方发消息过来时,先map.get(ID),如果结果不为null,则此结果即是该用户的MessageFrame,直接显示就行了,如果为null,证明与该用户的聊天窗口不存在,得new一个,同时map.put(ID, MessageFrame)。
      

  3.   

    关闭MessageFrame的时候记着map.remove(ID),刚才忘了说了
      

  4.   

    我想知道怎么实现这样的功能呢,到底是MessageFrame还是MainFrame设置监听线程呢
      

  5.   

    2楼的,我想静态的MAP是不是有点值得商确,如果好友上线下线怎么办
      

  6.   

    这个与好友上下线没有关系吧QQ上,如果你与一个好友正在聊天,聊天窗口没关,但是好友下线了,等一会他又上来了,这个时候原来的窗口还没关,那么他发来的消息还是显示在原来的窗口里。当聊天窗口关闭的时候只要map.remove(ID)就没事了map的生命周期是应用程序启动至关闭的整个过程,监听MessageFrame的windowClosing事件,添加map.remove(ID),对方发消息过来的时候根据map.get的结果判断要不要new MessageFrame