基于Swing的网络聊天室的设计实现

MOYchat--基于Swing的网络聊天室的设计实现

要求:

1、在IDEA中导入提供的Java工程“ChatRoom”,在其中完成后续设计实现。已提供的内容包括:

(1)MOYserver包:用于定义服务器端的功能,目前提供了服务器启动及响应客户端连接的功能,也是主要的客户端,每次使用的时候都要先去启动服务端,让电脑与本服务器进行连接,还有其他任务的实现功能我都写到注释里了。

(2)client包:用于定义客户端的功能,目前提供了dao包中的UserDao类,该类基于SQLog完成数据库相关操作,这部分属于扩展功能,非必须完成部分;service包中的Client类,该类用于发起对服务器的连接,并进行简单数据通信;

2、根据现有代码,自行设计完成关于聊天室的图形用户界面功能响应,下面给出相关包的代码。

一、(1)ChatConstant包实现的功能是简单的实现在线人数的功能,比如他在本地客服端,如果是,然后去登录,那就是login,如果不是就会提示你错误,这时候你去运行下服务端就行。

package client;

/**
 * 常量类//表示消息类型,就是简单的实现在线人数的功能
 */
public class ChatConstant {
    //上报在线
    public static final String ONLINE = "online";

    //登录
    public static final String LOGIN = "login";

    //退出
    public static final String LOGIN_OUT = "login_out";

    //错误提示
    public static final String ERROR_MSG = "error_msg";

    //聊天
    public static final String MSG = "msg";
}

 (2)ClientChatUI是实现登录MOY这个界面所要实现的一些重点功能,比如文本框、按钮、以及登录时候窗体大小颜色等等,详细功能都以注释在下面。

package client;

/**
 * MOY聊天窗口
 */

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;//在这里也可以使用import java.io.*
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;//在这里也可以使用import java.util.*

public class ClientChatUI extends JFrame implements ActionListener, KeyListener {

    private String userName;
    private String friend;

    //属性
    //文本框
    private JTextArea jta;
    //滚动条
    private JScrollPane jsp;
    //面板
    private JPanel jp;
    //文本框
    private JTextField jtf;
    //按钮
    private JButton jb;

    private ObjectInputStream socketReader = null;
    private ObjectOutputStream outputStream = null;

    ClientHandle clientHandle = null;

    public ClientChatUI(String userName, String friend,
                        ObjectInputStream socketReader, ObjectOutputStream outputStream) throws IOException {
        this.userName = userName;
        this.friend = friend;
        this.socketReader = socketReader;
        this.outputStream = outputStream;

        //初始化UI
        init();

        outputStream.writeObject(new Message(ChatConstant.ONLINE, userName, "2", userName));
        clientHandle = new ClientHandle(socketReader, jta, friend);
        clientHandle.start();
    }

    //构造方法
    public void init() {
        //初始化组件
        jta = new JTextArea();
        //设置文本域默认不可编辑
        jta.setEditable(false);
        //注释:需要将文本框添加到滚动条中,实现滚动效果
        jsp = new JScrollPane(jta);
        //面板
        jp = new JPanel();
        jtf = new JTextField(10);
        jb = new JButton("发送");
        //注释:需要将文本框与按钮添加到面板中
        jp.add(jtf);
        jp.add(jb);

        //注释:需要将滚动条与面板全部添加到窗体中
        this.add(jsp, BorderLayout.CENTER);
        this.add(jp, BorderLayout.SOUTH);

        //注释:需要设置“标题、大小、位置、关闭,是否可见”
        this.setTitle(String.format("与%s聊天...", friend));
        this.setSize(400, 350);
//        this.setLocation(500,400);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//        this.setVisible(true);

        //给发送按钮绑定一个监听事件
        jb.addActionListener(this);
        //给文本框绑定一个键盘点击事件
        jtf.addKeyListener(this);

        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                try {
                    outputStream.writeObject(new Message(ChatConstant.LOGIN_OUT, userName, null, null));
                    clientHandle.stop();
                } catch (IOException ex) {
                    System.out.println("退出QQ异常" + ex.getMessage());
                }
                System.out.println(userName + " 退出QQ..");
            }
        });

        setWindowsMiddleShow(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        reDataToSocket();
    }

    //行为 键盘监听
    @Override
    public void keyPressed(KeyEvent e) {
        //回车键
        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
            //发送数据到socket,通道中
            reDataToSocket();
        }
    }

    //定义一个方法,实现将数据发送到socket中
    private void reDataToSocket() {
        //1.获取文本框中需要发送的数据内容
        String text = jtf.getText();

        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        //2.拼接内容
        jta.append("(我) " + formatter.format(new Date()) + System.lineSeparator());

        //jta.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); // 设置组件方向为从右到左

        //3.自己提示
        jta.append(text + System.lineSeparator());
        try {

            outputStream.writeObject(new Message(ChatConstant.MSG
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨昀电子商务工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值