记录一个咸鱼大学生三个月的奋进生活028
复习Java(仿QQ聊天系统06发送接收消息功能完善)
今天我们来完善发送消息界面和接收消息界面的功能,之前静态页面在这个文章中已经介绍过了:复习Java第二个项目仿QQ聊天系统 01(界面部分),今天我们来写发送和接收消息功能的实现
UdpThread类(接收信息、以防阻塞)
这个类会在MainFrame中使用,当接收到信息时就触发,可以处理消息接收,还是个线程以防阻塞
package com.qq.listener;
// 以防阻塞的UdpThread,这个类同时有三个作用,1:是个线程可以处理多个消息发送,2:用观察者模式实现事件,3:还通过UdpSocket实现发送消息
import com.qq.pub.UdpSocket;
public class UdpThread extends Thread {
private UdpSocket udpSocket = null;
private UdpListener l = null;
// 重写构造方法将udpSocket作为参数传入
public UdpThread() {
// TODO Auto-generated constructor stub
}
public UdpThread(UdpSocket udpSocket) {
this.udpSocket = udpSocket;
}
// addUdpListener方法获得事件处理l,当有好友登录就会实例化udpSocket传输信息然后就会触发
public void addUdpListener(UdpListener l) {
this.l = l;
}
// 重写线程的run方法
@Override
public void run() {
while(true) {
String udpInfo = this.udpSocket.receive(); // 获得udpSocket接收到的信息
this.l.exectue(udpInfo); // 并将接收到的信息作为参数传给事件处理的l
}
}
}
MainFrame主页面中 双击好友发送消息的代码
然后回顾一下昨天在MainFrame主页面中写到过的怎么双击好友发送消息的代码,来看下实例化SendFrame(发送框)时都传入了什么参数
// 当左键双击好友时就实例化发送消息的窗体,这后面都是MouseListener接口的实现方法,我们只用的上这个点击事件,所以只重写这个方法
@Override
public void mouseClicked(MouseEvent e) {
if(1 == e.getButton() && 2 == e.getClickCount()) {
Qquser receiver = this.friendList.getSelectedValue();
SendFrame sendFrame = new SendFrame(this.fullUser, receiver);
sendFrame.setVisible(true);
}
}
可以看到我们在发送消息时传入了发送者对象的信息和接收好友的对象的信息
SendFrame发送消息框功能完善
这个类中要注意,当你发送消息时发出去的其实是一个报文,报文头为MESSAGE标记,然后是发送者的用户名和发送的消息,这都是会在接收信息时用到的
package com.qq.ui;
// 发送消息的页面
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import com.qq.bean.Qquser;
import com.qq.pub.CommonUse;
import com.qq.pub.UdpSocket;
public class SendFrame extends JFrame implements ActionListener {
private Qquser sender = null;
private Qquser receiver = null;
private JPanel topPanel;
private JPanel bottomPanel;
private JLabel receiverLabel = null;
private JTextField receiverField = null;
private