基于JAVA Swing,Hibernate,MySQL模拟QQ(二)
来源:互联网 发布:python字符串提取数字 编辑:程序博客网 时间:2024/06/05 20:07
接着之前的主题,这里讲一下各个JFrame之间的数据交互关系,
实际上,这里所有的面板的数据获取源都是Acceptor,在Acceptor中我定义了很多静态的属性:
public class Acceptor { public volatile static int Feedback = 0 ; public volatile static List<User> Friendlist; public static User host; public static ListPanel listpanel ; public static Set<Message> msgSet = new HashSet<>(100); public static List<userFrame> frameList = new ArrayList<>();
这样当Acceptor接收到数据后,Acceptor不会主动的推送这些数据到相应的面板上(Set msgSet 除外,Acceptor获取消息后,会判断是否存在相应的对话框,如果存在,则刷新当前对话框,否则只是标红List Panel中相应的friendlist)
下面来解释一下不同的属性的含义和作用:
Feedback :其实这是一个状态控制属性;server会返回不同的Interger,会保存在Feedback 上,但是在一个时间点上,Feedback 只会有一个值;一下是不同值的含义:
/**
* here Integer represent :
* 0 : silence ;
* 1 : Login success ;
* 2 : Login failed ;
* 3 : Register success ;
* 4 : Register failed ;
* 16: server send successfully ;
* 17: client offline ;
* @author crf
*/
(原谅我的渣英语,我正在努力学好英语中~~~)
host : 客户端当前用户信息,这个不用解释了吧;
Friendlist:好友列表信息,这个之所以要保存,是因为每次创建新的对话框的时候,需要调用这些信息;
ListPanel:同样的也是因为对话框需要调用这里的信息;
msgSet:每次当msgSet发生变更的时候,便会主动的刷新对话框中的对话列表,而且系统开启后,该msgSet只会增加msg不能删除,也不能修改;Message的类的hashcode是由time和accepter两个部分组成;这样保证在每个对话列表中,根据时间排序;
frameList :保存已经存在的对话框;每次在点击好友头像时,会检查该list,如果对话框已经存在,则只是显示该对话框,而不新建,否则新建对话框;
好了,说到这里,其实这里的资源池,基本上都是为了对话框准备的~~它才是整个客户端的宝啊。。。
下面是Acceptor余下的代码:
private Acceptor(){} private static final Acceptor acceptor = new Acceptor(); public static Acceptor getInstance(){ return acceptor; } public void acceptFeedback(){ new Thread(new Runnable() { public void run() { try(ServerSocket ssocket = new ServerSocket(8887)){ //ServerSocket ssocket = new ServerSocket(8887); while(true){ System.out.println("system listener start..."); /** * utilize new feature of JAVA 8 ; here can close the stream * automatically ; */ Socket skt = ssocket.accept(); System.out.println("get the feed back from server:"+skt.getInetAddress()); try(ObjectInputStream incube=new ObjectInputStream(skt.getInputStream())) { Object obj = incube.readObject(); /** * here get the User Object ; */ if(obj instanceof Integer){ System.out.println("feedback Msg :"+(Integer)obj); Feedback = (Integer) obj ; } else if(obj instanceof Message){ Message msg = (Message) obj;/************************************************************************************************* set the target panel of friendList border red ;* notice here : (msg.getSenter().getID()+"").equals(panel.getName()) ;* I used the User.ID to name the panel we created ;*/ for (JPanel panel :listpanel.getPanelList()){ if((msg.getSenter().getID()+"").equals(panel.getName())){ panel.setBorder(BorderFactory.createLineBorder(Color.RED,3)); listpanel.repaint(); msgSet.add(msg); } }/***********************************************************************************************/ }else if (obj instanceof List){ Friendlist =(List<User>) obj; } } catch (ClassNotFoundException e) { e.printStackTrace(); } } } catch (IOException e) { e.printStackTrace(); } } }).start(); }}
Acceptor是单独开启的线程,循环不停的接收服务器信息;有些在其他循环中会用到的静态属性,是volatile 修饰的,这样保证其他线程能正确获取属性的值;
- 基于JAVA Swing,Hibernate,MySQL模拟QQ(二)
- 基于JAVA Swing,Hibernate,MySQL模拟QQ
- JAVA Swing(二)
- Java Swing 局域网的聊天--山寨QQ(增加了例子源码和mysql脚本)
- 自己模仿QQ基于Java Swing做的一个QQ界面
- java:Swing(1)模拟随机抽签
- Swing学习----------QQ登录界面制作(二)
- Swing学习----------QQ登录界面制作(二)
- QQ界面Swing模拟,真正的一样
- java Swing QQ登陆界面
- Java Swing实现仿QQ
- java课程设计模拟计算器:基于swing的高仿真模拟计算器 Eclipse6.5
- Java swing 仿QQ实现系统托盘图标(上)
- Java swing 仿QQ实现系统托盘图标(下)
- Java核心技术(高级Swing)二表格
- java学习值swing编程 (二)
- java swing中的MVC模式(二)
- Java的swing编程(二)
- NOIP提高组2001-统计单词个数
- 初识Hibernate
- 关于Eclipse中Working Sets的问题
- ZOJ
- hiho一下第168周 扩展二进制数
- 基于JAVA Swing,Hibernate,MySQL模拟QQ(二)
- CAS单点登录-Cas-Management(八)
- Linux文本比较指令(diff,cmp)详解
- eclipse里搭建hadoop环境遇到的问题
- typescript中的module和export
- 安测云验证有CTA问题
- Hibernate入门到开发(二)详解核心配置文件
- Install and Run MongoDB
- javascript继承方法(一)