【项目实战】用 Java 写了一个类QQ界面聊天小项目,可在线聊天!

蜘蛛侠不会飞 2021-01-23 17:55:34
java 项目 实战 一个 写了


1.功能实现

1.修改功能(密码、昵称、个性签名)

2.添加好友、删除好友

3.单聊功能

4.判断好友是否在线

2.模块划分

图片

==

3.使用的知识

  • netty
  • swing
  • 集合等同步阻塞队列synchronousQueue
  • 数据库MySQL中的CRUD
  • C3p0连接池
  • JSON字符串

==

4.部分代码实现

1.nettyController.java

  • 接收到来自客户端的消息,与dao层进行交互
  • dao层与之数据库进行交互

修改密码

图片

添加好友

图片

从添加好友逻辑实现上我走了很多的弯路频繁的访问数据库,这是一件很不好的事情

package chat.Project.controller;
import chat.Project.bean.information;
import chat.Project.constant.EnMsgType;
import chat.Project.dao.*;
import chat.utils.CacheUtil;
import chat.utils.JsonUtils;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.netty.channel.Channel;
import java.util.ArrayList;
import java.util.Iterator;
public class NettyController {
    private static UserDao userDao = new UserDaoImpl();
    private static informationDao informationDao = new informationDaoImpl();
    private static friendDao friendDao = new friendDaoImpl();
    public static String processing(String message, Channel channel){
        //解析客户端发送的消息
        ObjectNode jsonNodes = JsonUtils.getObjectNode(message);
        String msgtype = jsonNodes.get("msgtype").asText();
        if (EnMsgType.EN_MSG_LOGIN.toString().equals(msgtype)){
            //登录操作
            return loginOperation(jsonNodes,channel);
        }else if (EnMsgType.EN_MSG_MODIFY_SIGNATURE.toString().equals(msgtype)){
            //修改签名
            return modifySignature(jsonNodes);
        }else if (EnMsgType.EN_MSG_MODIFY_NICKNAME.toString().equals(msgtype)){
            //修改昵称
            return modifyNickname(jsonNodes);
        }else if (EnMsgType.EN_MSG_GETINFORMATION.toString().equals(msgtype)){
            //获取登录信息
            return getInformation(jsonNodes);
        }else if (EnMsgType.EN_MSG_VERIFY_PASSWORD.toString().equals(msgtype)){
            //进行修改密码
            return verifyPasswd(jsonNodes);
        }else if (EnMsgType.EN_MSG_CHAT.toString().equals(msgtype)){
            //单聊模式
            return SingleChat(jsonNodes);
        }else if (EnMsgType.EN_MSG_GET_ID.toString().equals(msgtype)){
            //获取id
            return getId(jsonNodes);
        }else if (EnMsgType.EN_MSG_GET_FRIEND.toString().equals(msgtype)){
            //获取好友列表
            return getFriend(jsonNodes);
        }else if (EnMsgType.EN_MSG_ADD_FRIEND.toString().equals(msgtype)){
            //添加好友
            return addFriends(jsonNodes);
        }else if (EnMsgType.EN_MSG_DEL_FRIEND.toString().equals(msgtype)){
            //删除好友
            return delFriend(jsonNodes);
        }else if (EnMsgType.EN_MSG_ACTIVE_STATE.toString().equals(msgtype)){
            //判断好友的在线状态
            return friendIsActive(jsonNodes);
        }
        return "";
    }
    //判断好友在线状态
    private static String friendIsActive(ObjectNode jsonNodes) {
        int friendId = jsonNodes.get("friendId").asInt();
        ObjectNode objectNode = JsonUtils.getObjectNode();
        objectNode.put("msgtype",EnMsgType.EN_MSG_ACK.toString());
        objectNode.put("srctype",EnMsgType.EN_MSG_ACTIVE_STATE.toString());
        //客户端保证用户独立存在且是好友
        Channel channel = CacheUtil.get(friendId);
        //判断用户是否在线
        if (channel == null){
            //用户不在线
            objectNode.put("code",200);
        }else {
            //用户在线
            objectNode.put("code",300);
        }
        return objectNode.toString();
    }
    //添加好友
    private static String delFriend(ObjectNode jsonNodes) {
        Integer friendId = jsonNodes.get("friendId").asInt();
        int userId = jsonNodes.get("id").asInt();
        String localName = jsonNodes.get("localName").asText();
        //封装发回客户端的JSON
        ObjectNode objectNode = JsonUtils.getObjectNode();
        objectNode.put("msgtype",EnMsgType.EN_MSG_ACK.toString());
        objectNode.put("srctype",EnMsgType.EN_MSG_DEL_FRIEND.toString());
        objectNode.put("code",200);
        //验证是否存在当前好友
        information information = informationDao.getInformation(friendId);
        String friendName = information.getNickname();
        //查询自己是否有该好友
        boolean exist = friendDao.isExist(friendName,userId);
        if (exist){
            //存在当前好友进行删除操作
            friendDao.delFriend(userId,friendName);
            friendDao.delFriend(friendId,localName);
            objectNode.put("code",300);
        }
        return objectNode.toString();
    }
    //添加好友
    private static String addFriends(ObjectNode jsonNodes) {
        Integer friendId = jsonNodes.get("friendId").asInt();
        int userId = jsonNodes.get("id").asInt();
        String localName = jsonNodes.get("localName").asText();
        //验证是否有ID
        boolean exists = userDao.verifyExistFriend(friendId);
        ObjectNode objectNode = JsonUtils.getObjectNode();
        objectNode.put("msgtype",EnMsgType.EN_MSG_ACK.toString());
        objectNode.put("srctype",EnMsgType.EN_MSG_ADD_FRIEND.toString());
        objectNode.put("code",200);
        if(exists){
            //表示存在此id
            objectNode.put("code",300);
            //获取好友昵称
            information information = informationDao.getInformation(friendId);
            String friendNickname = information.getNickname();
            //进行添加好友的操作   两个对应的信息都应该添加
            friendDao.addFriends(userId,localName,friendNickname);
            friendDao.addFriends(friendId,friendNickname,localName);
        }
        return objectNode.toString();
    }
    //获取好友列表
    private static String getFriend(ObjectNode jsonNodes) {
        int uid = jsonNodes.get("uid").asInt();
        //返回ArrayLis集合
        ArrayList<String> friends = friendDao.getFriends(uid);
        //封装JSON
        ObjectNode objectNode = JsonUtils.getObjectNode();
        objectNode.put("msgtype",EnMsgType.EN_MSG_ACK.toString());
        objectNode.put("srctype",EnMsgType.EN_MSG_GET_FRIEND.toString());
        //写回friend集合
        Iterator<String> iterator = friends.iterator();
        int i = 0;
        while (iterator.hasNext()){
            objectNode.put("res"+i,iterator.next());
            i++;
        }
        //记录好友个数
        objectNode.put("count",i);
        return objectNode.toString();
    }
    //获取id
    private static String getId(ObjectNode jsonNodes) {
        String nickname = jsonNodes.get("nickname").asText();
        information information = informationDao.nicknameGetId(nickname);
        //联系人的id
        int uid = information.getUid();
        //封装JSON
        ObjectNode objectNode = JsonUtils.getObjectNode();
        objectNode.put("msgtype",EnMsgType.EN_MSG_ACK.toString());
        objectNode.put("srctype",EnMsgType.EN_MSG_GET_ID.toString());
        objectNode.put("uid",uid);
        return objectNode.toString();
    }
    //单聊模式
    private static String SingleChat(ObjectNode jsonNodes) {
        int id = jsonNodes.get("id").asInt();
        //根据id在friend表获取登录用户名
        //封装JSON数据服务端转发数据
        ObjectNode objectNode = JsonUtils.getObjectNode();
        objectNode.put("msgtype",EnMsgType.EN_MSG_ACK.toString());
        objectNode.put("srctype",EnMsgType.EN_MSG_CHAT.toString());
        //客户端保证用户独立存在且是好友
        Channel channel = CacheUtil.get(id);
        //判断用户是否在线
        if (channel == null){
            //用户不在线
            objectNode.put("code",200);
        }else{
            //用户在线
            objectNode.put("code",300);
            //消息转发
            channel.writeAndFlush(jsonNodes.toString());
        }
        return objectNode.toString();
    }
    //修改密码
    private static String verifyPasswd(ObjectNode jsonNodes) {
        int id = jsonNodes.get("id").asInt();
        String oldPasswd = jsonNodes.get("oldPasswd").asText();
        String newPasswd = jsonNodes.get("newPasswd").asText();
        boolean exits = userDao.verifyPassword(oldPasswd, id);
        ObjectNode objectNode = JsonUtils.getObjectNode();
        objectNode.put("msgtype",EnMsgType.EN_MSG_VERIFY_PASSWORD.toString());
        objectNode.put("code",200);
        if (exits){
            //验证成功
            userDao.modifyPasswd(newPasswd,id);
            objectNode.put("code",300);
        }
        return objectNode.toString();
    }
    //获取信息
    private static String getInformation(ObjectNode jsonNodes) {
        int id = jsonNodes.get("id").asInt();
        information information = informationDao.getInformation(id);
        //封装JSON发回客户端
        ObjectNode objectNode = JsonUtils.getObjectNode();
        objectNode.put("msgtype",EnMsgType.EN_MSG_ACK.toString());
        objectNode.put("srctype",EnMsgType.EN_MSG_GETINFORMATION.toString());
        objectNode.put("Nickname",information.getNickname());
        objectNode.put("Signature",information.getSignature());
        return objectNode.toString();
    }
    //修改昵称
    private static String modifyNickname(ObjectNode jsonNodes) {
        int id = jsonNodes.get("id").asInt();
        String nickname = jsonNodes.get("nickname").asText();
        //进行存储
        informationDao.storeNickname(nickname,id);
        return "";
    }
    //修改签名
    private static String modifySignature(ObjectNode jsonNodes) {
        int id = jsonNodes.get("id").asInt();
        String signature = jsonNodes.get("signature").asText();
        //进行存储
        informationDao.storeSignature(signature,id);
        return "";
    }
    //登录操作
    private static String loginOperation(ObjectNode objectNode,Channel channel) {
        int id = objectNode.get("id").asInt();
        String passwd = objectNode.get("passwd").asText();
        //进行数据库查询
        boolean exits = userDao.getInformation(id, passwd);
        ObjectNode jsonNodes = JsonUtils.getObjectNode();
        jsonNodes.put("msgtype",EnMsgType.EN_MSG_ACK.toString());
        jsonNodes.put("srctype",EnMsgType.EN_MSG_LOGIN.toString());
        jsonNodes.put("code",300);
        //返回状态码
        if (exits){
            jsonNodes.put("code",200);
            //添加用户的在线信息
            CacheUtil.put(id,channel);
        }
        return jsonNodes.toString();
    }
}

2.ClientHandler.java

客户端接受来自服务端返回的消息

根据返回的状态码来判断是否操作成功

package chat.Project.netty;
import chat.Frame.chat.ChatFrame;
import chat.Frame.chat.linkmen;
import chat.Frame.chat.login;
import chat.Project.constant.EnMsgType;
import chat.util.JsonUtils;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import java.util.concurrent.SynchronousQueue;
public class ClientHandler extends SimpleChannelInboundHandler<String> {
    //定义一个同步阻塞队列状态码
    public static SynchronousQueue<Object> queue = new SynchronousQueue<>();
    public static String Nickname;
    public String Signature;
    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception {
    }
    //客户端接收数据
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println(msg);
        //解析服务端发送的消息
        ObjectNode jsonNodes = JsonUtils.getObjectNode((String) msg);
        String msgtype = jsonNodes.get("msgtype").asText();
        if (EnMsgType.EN_MSG_ACK.toString().equals(msgtype)) {
            String srctype = jsonNodes.get("srctype").asText();
            if (EnMsgType.EN_MSG_LOGIN.toString().equals(srctype)) {
                //登录操作
                queue.offer(jsonNodes.get("code").asInt());
            }else if(EnMsgType.EN_MSG_GETINFORMATION.toString().equals(srctype)){
                //存取信息
                 Nickname = jsonNodes.get("Nickname").asText();
                 Signature = jsonNodes.get("Signature").asText();
                linkmen.label_1.setText(Nickname);
                linkmen.field.setText(Signature);
            }else if (EnMsgType.EN_MSG_CHAT.toString().equals(srctype)){
                //发送端返回消息
                queue.offer(jsonNodes.get("code").asInt());
            }else if (EnMsgType.EN_MSG_GET_ID.toString().equals(srctype)){
                int uid = jsonNodes.get("uid").asInt();
                queue.offer(uid);
            }else if (EnMsgType.EN_MSG_GET_FRIEND.toString().equals(srctype)){
                //获取登录用户的好友
                int count = jsonNodes.get("count").asInt();
                login.friend = new String[count];
                for ( int i = 0;i<count;i++){
                    login.friend[i] = jsonNodes.get("res"+i).asText();
                    System.out.println(jsonNodes.get("res"+i));
                }
            }else if (EnMsgType.EN_MSG_ADD_FRIEND.toString().equals(srctype)){
                //添加好友
                queue.offer(jsonNodes.get("code").asInt());
            }else if (EnMsgType.EN_MSG_DEL_FRIEND.toString().equals(srctype)){
                //删除好友
                queue.offer(jsonNodes.get("code").asInt());
            }else if (EnMsgType.EN_MSG_ACTIVE_STATE.toString().equals(srctype)){
                //好友在线状态
                queue.offer(jsonNodes.get("code").asInt());
            }
        }else if (EnMsgType.EN_MSG_VERIFY_PASSWORD.toString().equals(msgtype)){
            //修改密码
            int code = 0;
            code = jsonNodes.get("code").asInt();
            queue.offer(code);
        }else if (EnMsgType.EN_MSG_CHAT.toString().equals(msgtype)){
            //接收端接受消息  封装朋友昵称
            String message = " "+ jsonNodes.get("message").asText();
            //聊天显示框读取消息
            ChatFrame.sb.append(message+"n");
            ChatFrame.displayTextPanel.setText(ChatFrame.sb.toString());
        }
    }
}

3.linkmen.java

这是登录成功的界面

package chat.Frame.chat;
import chat.Frame.operation.alterColumn.changeNickname;
import chat.Frame.operation.alterColumn.changePassword;
import chat.Frame.operation.alterColumn.changeSignature;
import chat.Frame.operation.friendHandle.addFriend;
import chat.Frame.operation.friendHandle.delFriend;
import chat.Frame.tipFrame;
import chat.Project.services.sendServers;
import io.netty.channel.Channel;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
/**
 * 联系人界面
 */
public class linkmen extends JFrame {
    //容器
    private JFrame frame;
    //标签
    private JLabel  label_2, label_3, label_4, label;
    //昵称
    public static JLabel label_1;
    //状态框
    private JComboBox box, box_1, box_2;
    //图片
    private ImageIcon icon_1, icon;
    //文本
    private JTextField  field_1;
    //个性签名
    public static JTextField field;
    //面板
    private JPanel panel_1, panel_3, panel;
    //滚动面板
    public JScrollPane panel_2;
    //列表
    public static JList list;
    //与服务端通信的通道
    private Channel channel;
    //用户的id
    private Integer id;
    //暂存oldPasswd
    public static JLabel label_5,label_6;
    //好友列表数组
    private String[] fd;
    //列表
    public static DefaultListModel<String> model;
    public linkmen(Integer id, Channel channel,String[] fd) {
        this.id = id;
        this.channel = channel;
        this.fd = fd;
    }
    public void init() {
        //初始化面板1并设置信息
        panel_1 = new JPanel();
        panel_1.setLayout(null);
        panel_1.setLocation(0, 0);
        panel_1.setBorder(BorderFactory.createTitledBorder("资料卡"));
        panel_1.setSize(new Dimension(295, 148));
        panel_1.setOpaque(false);
        //初始化面板3并设置信息
        panel_3 = new JPanel();
        panel_3.setLayout(null);
        panel_3.setBorder(BorderFactory.createTitledBorder("系统设置"));
        panel_3.setLocation(0, 617);
        panel_3.setSize(new Dimension(295, 55));
        panel_3.setOpaque(false);
        //设置头像标签
        label_2 = new JLabel(new ImageIcon("E:聊天软件untitledsrcimageSource4.png"));
        label_2.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        label_2.setBounds(15, 15, 100, 100);
        panel_1.add(label_2);
        //初始暂存标签
        label_5 = new JLabel();
        label_6 = new JLabel();
        //设置昵称标签
        label_1 = new JLabel("");
        label_1.setBounds(130, 10, 100, 30);
        label_1.setFont(new Font("宋体", Font.PLAIN, 18));
        panel_1.add(label_1);
        list = new JList<String>(model);
        //设置每个列表的高
        list.setFixedCellHeight(20);
        list.setSelectionBackground(new Color(0xD8FF2F));
        list.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                //打开一个聊天窗口
                if (e.getValueIsAdjusting()) {
                    for (int i = 0; i < model.size(); i++) {
                        if (model.get(i).equals(list.getSelectedValue())){
                            //获取id有错误
                            int ids = new sendServers(channel).getId((String) list.getSelectedValue());
                            if (ids!=0) {
                                new sendServers(channel).friendIsActive(ids);
                                new ChatFrame(ids, channel).setVisible(true);
                            }else{
                                System.out.println("好友不存在");
                            }
                        }
                    }
                }
            }
        });
        //初始化面板二
        panel_2 = new JScrollPane(list);
        panel_2.setBorder(BorderFactory.createTitledBorder("联系人"));
        panel_2.setLocation(0, 147);
        panel_2.setSize(new Dimension(295, 470));
        panel_2.getViewport().setOpaque(false);
        list.setOpaque(false);
        panel_2.setOpaque(false);
        //设置在线状态bBox();
        box = new JComboBox();
        box.addItem("在线");
        box.addItem("uD83DuDCBF隐身");
        box.addItem("uD83DuDCBB忙碌");
        box.addItem("离线");
        box.setBounds(200, 10, 70, 30);
        panel_1.add(box);
        //设置个性签名的标签
        label_4 = new JLabel("个性签名:");
        label_4.setFont(new Font("宋体", Font.PLAIN, 16));
        label_4.setForeground(Color.BLUE);
        label_4.setBounds(120, 50, 100, 20);
        panel_1.add(label_4);
        //设置文本
        field = new JTextField("");
        field.setBounds(120, 80, 160, 30);
        panel_1.add(field);
        label_3 = new JLabel("uD83DuDD0D");
        label_3.setForeground(Color.RED);
        label_3.setBounds(10, 122, 20, 20);
        panel_1.add(label_3);
        //设置搜索栏
        field_1 = new JTextField();
        field_1.setBounds(30, 120, 250, 25);
        panel_1.add(field_1);
        //对面板三进行初始化
        box_1 = new JComboBox();
        box_1.addItem("uD83DuDD12uD83DuDD28uD83DuDD13");
        box_1.addItem("修改密码");
        box_1.addItem("修改昵称");
        box_1.addItem("修改签名");
        box_1.setBounds(8, 20, 100, 25);
        panel_3.add(box_1);
        box_1.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if ("修改签名".equals(box_1.getSelectedItem())) {
                    //执行一次
                    if (e.getStateChange() == ItemEvent.SELECTED) {
                        changeSignature changeSignature = new changeSignature(linkmen.this);
                        changeSignature.setVisible(true);
                        field.setText(changeSignature.jTextField.getText());
                        String signature = field.getText();
                        //存储签名的方法
                        new sendServers(channel).modifySignature(signature, id);
                    }
                }
                if ("修改密码".equals(box_1.getSelectedItem())) {
                    if (e.getStateChange() == ItemEvent.SELECTED) {
                        changePassword changePassword = new changePassword(linkmen.this);
                        changePassword.setVisible(true);
                        label_5.setText(changePassword.oldPassword.getText());
                        String oldPasswd = label_5.getText();
                        label_6.setText(new String(changePassword.newPassword.getPassword()));
                        String newPasswd = label_6.getText();
                        //进行验证
                        new sendServers(channel).verifyPasswd(oldPasswd, id,newPasswd);
                    }
                }
                if ("修改昵称".equals(box_1.getSelectedItem())) {
                    if (e.getStateChange() == ItemEvent.SELECTED) {
                        changeNickname changeNickname = new changeNickname(linkmen.this);
                        changeNickname.setVisible(true);
                        label_1.setText(changeNickname.jTextField.getText());
                        String nickname = label_1.getText();
                        //存储昵称
                        new sendServers(channel).modifyNickname(nickname, id);
                    }
                }
            }
        });
        //添加好友、删除好友
        box_2 = new JComboBox();
        box_2.addItem("uD83DuDC65");
        box_2.addItem("添加好友");
        box_2.addItem("删除好友");
        box_2.setBounds(170, 20, 100, 25);
        box_2.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if ("添加好友".equals(box_2.getSelectedItem())) {
                    if (e.getStateChange() == ItemEvent.SELECTED) {
                        addFriend addFriend = new addFriend(linkmen.this);
                        addFriend.setVisible(true);
                        //读取要搜索的ID
                        String friendIds = addFriend.jTextField.getText();
                        //判断是否是字符串
                        if (judgeDigit(friendIds)){
                            int friendId = Integer.parseInt(friendIds);
                            //搜索数据库
                            new sendServers(channel).addFriendOperate(friendId,id,label_1.getText());
                        }else {
                            new tipFrame().init("输入参数错误");
                        }
                    }
                }
                if ("删除好友".equals(box_2.getSelectedItem())) {
                    if (e.getStateChange() == ItemEvent.SELECTED) {
                        delFriend delFriend = new delFriend(linkmen.this);
                        delFriend.setVisible(true);
                        //对其数据库进行删除操作
                        String friendIds = delFriend.TextField.getText();
                        //判断是否是字符串
                        if(judgeDigit(friendIds)){
                            int friendId = Integer.parseInt(friendIds);
                            //操作数据库
                            new sendServers(channel).delFriendOperate(friendId,id,label_1.getText());
                        }else{
                            new tipFrame().init("输入参数错误");
                        }
                    }
                }
            }
        });
        panel_3.add(box_2);
        //设置frame信息
        frame = new JFrame();
        //设置窗体信息
        frame.setTitle("腾讯QQ");
        //给窗体设置图片
        icon_1 = new ImageIcon("E:聊天软件untitledsrcimageSource3.png");
        frame.setIconImage(icon_1.getImage());
        icon = new ImageIcon("E:聊天软件untitledsrcimageSource5.png");
        label = new JLabel(icon);
        //获取窗口的第二层,将label放入
        frame.getLayeredPane().add(label, new Integer(Integer.MIN_VALUE));
        //获取frame的顶层容器,并设置为透明
        panel = (JPanel) frame.getContentPane();
        panel.setOpaque(false);
        frame.setLayout(null);
        frame.setLocation(750, 150);
        frame.setSize(287, 700);
        frame.setVisible(true);
        frame.setResizable(false);
        label.setBounds(0, 0, 287, 700);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(panel_1);
        frame.add(panel_2);
        frame.add(panel_3);
    }
    public void mian() {
        //初始化面板2并设置信息
        model = new DefaultListModel<>();
        for (int i = 0; i < fd.length; i++) {
            model.addElement(fd[i]);
        }
        init();
        //更新昵称和签名
        new sendServers(channel).update(id);
        //获取用户的昵称,和好友列表
        //设置签名和昵称字体初始样式和大小
        label_1.setFont(new Font("宋体", Font.PLAIN, 18));
        field.setFont(new Font("宋体", Font.PLAIN, 18));
    }
    //判断是否是数字
    private static boolean judgeDigit(String string){
        for (int i = 0; i < string.length(); i++) {
            if (!Character.isDigit(string.charAt(i))){
                return false;
            }
        }
        return true;
    }
}

4.tipFrame

提示操作状态窗口

package chat.Frame;
import chat.Frame.chat.linkmen;
import chat.Frame.operation.alterColumn.changeNickname;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class tipFrame extends JDialog {
    private Container container;
    //显示错误信息
    public JLabel label;
    //确认按钮
    private JButton button;
    public tipFrame(){
    }
    public void init(String msg){
        container = getContentPane();
        label = new JLabel(msg);
        label.setBounds(70,0,200,70);
        label.setFont(new Font("微软雅黑",Font.PLAIN,20));
        container.add(label);
        button = new JButton("确认");
        button.setBounds(35,50,140,40);
        container.add(button);
        setBounds(780,170,220,140);
        setLayout(null);
        setVisible(true);
        container.setBackground(new Color(0xD8FFD5));
        //提示窗口前置
        setAlwaysOnTop(true);
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                tipFrame.this.dispose();
            }
        });
    }
}

==

5.运行例图

1.登录界面

图片

注册账号和忘记密码没有添加事件现在就是个摆设

--

2.联系人界面

图片

这里面的所有功能都可以使用

--

3.聊天界面

图片

这个里面表情按钮没弄好

4.通信的过程

图片

5.修改操作

图片

6.好友的操作

图片

项目推荐:

2000多G的计算机各行业电子资源分享(持续更新)

2020年微信小程序全栈项目之喵喵交友【附课件和源码】

Spring Boot开发小而美的个人博客【附课件和源码】

Java微服务实战296集大型视频-谷粒商城【附代码和课件】

Java开发微服务畅购商城实战【全357集大项目】-附代码和课件

最全最详细数据结构与算法视频-【附课件和源码】​​​​​​​

在这里插入图片描述

版权声明
本文为[蜘蛛侠不会飞]所创,转载请带上原文链接,感谢
https://segmentfault.com/a/1190000039070580

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云