⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chatarea.java

📁 1. 消息即时通信 2. 消息发送实现一对一、一对多等多种发送模式 3. 发送的消息实现多彩文本编辑
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
    jpanel1.add(jpanel2, BorderLayout.WEST);
    jpanel1.add(jpanel3, BorderLayout.EAST);

    jpanel2.add(messageEditor);
    jpanel2.setBackground(bgcolor);

    jpanel3.setBackground(bgcolor);
    jpanel3.setLayout(new BorderLayout());
    jpanel3.add(sendMessageButton, BorderLayout.WEST);
    jpanel3.add(sendObject, BorderLayout.CENTER);

    this.setLayout(borderLayout1);
    this.add(jmenuBar, BorderLayout.NORTH);
    this.add(jsplitPane2, BorderLayout.CENTER);
    this.add(jpanel1, BorderLayout.SOUTH);


    //添加菜单事建处理
    loginOut.addActionListener(action);
    sendFile.addActionListener(action);
    gongzuo.addActionListener(revertAction);
    chifan.addActionListener(revertAction);
    youshi.addActionListener(revertAction);
    zidingyi.addActionListener(revertAction);
    quxiao.addActionListener(revertAction);
    consoleMenuItem.addActionListener(consoleAction);
    chatLogPriMenuItem.addActionListener(chatLogAction);
    chatLogPubMenuItem.addActionListener(chatLogAction);
    chatLogCloseMenuItem.addActionListener(chatLogAction);

    sendMessageButton.addActionListener(action);
    clearSendObjectButton.addActionListener(action);
    //用户在线列表鼠标事件
    peopleList.addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent me) {
        JList list = (JList) me.getSource();
        if (me.getClickCount() == 1) {//单击选择对象
          selectName = (String) peopleList.getSelectedValue();
          if (!toPeople.contains(selectName)) {
            toPeople.addElement(selectName);
            selectNameSB.append(selectName + " ");
            ChatArea.sendObject.setText(selectNameSB.toString());
          }
        }
        else if (me.getClickCount() == 2) {//双击取消选定对象
          selectName = (String) peopleList.getSelectedValue();
          if (toPeople.contains(selectName) && selectName != null) {
            toPeople.removeElement(selectName);
            selectNameSB.delete(selectNameSB.indexOf(selectName),
                                selectNameSB.indexOf(selectName) +
                                selectName.length() + 1);
            ChatArea.sendObject.setText(selectNameSB.toString());
          }
        }
      }
    });

    messageThread = new Thread(this);
    //设置鼠标靠近提示信息
    peopleList.setToolTipText(constant.getLang("CA_peopleList"));
    sendObject.setToolTipText(constant.getLang("CA_sendObject"));
  }
  /**
   * 连接服务器方法
   * @param socket Socket 客户套接
   * @param out DataOutputStream  输出流
   * @param in DataInputStream 输入流
   */

  public void setConnection(Socket socket, DataOutputStream out,
                            DataInputStream in) {
    this.socket = socket;
    this.out = out;
    this.in = in;
    loginMenu.setEnabled(true);
    fileMenu.setEnabled(true);
    revertMenu.setEnabled(true);
    consoleMenu.setEnabled(true);
    chatLogMenu.setEnabled(true);
    sendMessageButton.setEnabled(true);
    clearSendObjectButton.setEnabled(true);
    userName = loginDialog.getName();

    try {
      messageThread.start();//启动当前线程
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }
  /**
   * 取得 socket对象
   * @return Socket  socket对象
   */
  public static Socket getSocket() {
    return socket;
  }
  /**
   * 取得输出流
   * @return DataOutputStream  输出流
   */
  public static DataOutputStream getOut() {
    return out;
  }
  /**
   * 线程执行体
   */

  public void run() {
    while (true) {//无限循环,一直侦听
      String _message = null;//接收的消息
      try {
        _message = in.readUTF();//取得接收到的消息
        if (_message.startsWith("PRIVATE_MESSAGE:")) {//私人消息
          String _headMessage = _message.substring(_message.indexOf(
              "PRIVATE_MESSAGE:") + 16, _message.indexOf("#CONTENT#"));//取得头消息
          String _content = _message.substring(_message.indexOf("#CONTENT#") +
                                               9);//聊天内容
          try {
            StringReader stringReader = new StringReader(
                "<p><font color=\"#0080C0\">^" + _headMessage + "^</font></p>" +
                _content);//把显示内容转化成流对象
            editorKit.read(stringReader, privateDoc, privateDoc.getLength());//把聊天内容显示在私人区
          }
          catch (BadLocationException e) {
          }
          if (REVERTOPTION == 1) {//如果用户设置的是自动回复方式
            String _fromPeople = _headMessage.substring(0,
                _headMessage.indexOf("对您说:"));
            out.writeUTF("PRIVATE_MESSAGE:" + "#TOPEOPLE#" + _fromPeople +
                         "#MESSAGECONTENT#" + REVERTMESSAGE);//输出自动回复信息
          }
          if (tablePane.getSelectedIndex() != 1) {//如果用户当前查看的信息面板不是私人区,设置提示图片
            tablePane.setIconAt(1, privateTableNew);
          }
        }
        else if (_message.startsWith("PUBLIC_MESSAGE:")) {//公共消息
          String _headMessage = _message.substring(_message.indexOf(
              "PUBLIC_MESSAGE") + 15, _message.indexOf("#CONTENT#"));//取得头消息
          String content = _message.substring(_message.indexOf("#CONTENT#") + 9);//取得聊天内容
          try {
            StringReader stringReader = new StringReader(
                "<p><font color=\"#0080C0\">^" + _headMessage + "^</font></p>" +
                content);//转换成流对象
            editorKit.read(stringReader, publicDoc, publicDoc.getLength());//显示信息
          }
          catch (BadLocationException e) {
          }
          if (REVERTOPTION == 1) {//当前用户设置了自动回复方式
            String _fromPeople = _headMessage.substring(0,
                _headMessage.indexOf("对大家说:"));//取得发送消息的对象
            out.writeUTF("PRIVATE_MESSAGE:" + "#TOPEOPLE#" + _fromPeople +
                         "#MESSAGECONTENT#" + REVERTMESSAGE);//发送消息给相应的对象
          }
          if (tablePane.getSelectedIndex() != 0) {//当前查看的面板不是公共的,设置提示信息
            tablePane.setIconAt(0, publicTableNew);
          }
        }
        else if (_message.startsWith("LOGIN_PEOPLE:")) {//用户登陆
          String peopleName = _message.substring(_message.indexOf(":") + 1);//取得用户名
          peopleTable.put(peopleName, peopleName);//添加进hashtable
          model.addElement( (String) peopleTable.get(peopleName));//把对象添加到list 的model对象中
          peopleList.validate();//刷新显示
        }
        else if (_message.startsWith("SEND_FILE:")) {//发送文件
          String _requestPeople = _message.substring(_message.indexOf(
              "SEND_FILE:") + 10, _message.indexOf("#TOSENDFILE#"));//请求发送文件的对象
          String _toSendFile = _message.substring(_message.indexOf(
              "#TOSENDFILE#") + 12, _message.indexOf("#IPADDRESS#"));//请求发送的文件名
          String _ipAddress = _message.substring(_message.indexOf("#IPADDRESS#") +
                                                 11, _message.indexOf("#PORT#"));//请求者的ip地址

          int port = (Integer.valueOf(_message.substring(_message.lastIndexOf(
              "#PORT#") + 6, _message.lastIndexOf("#FILE_LENGTH#")))).intValue();//端口号

          String fileLength = _message.substring(_message.lastIndexOf(
              "#FILE_LENGTH#") + 13);//发送文件的长度
          File file = new File(_toSendFile);
          try {
            fb = new FileDisposeButton(_requestPeople, _toSendFile, _ipAddress,
                                       port, fileLength);//文件处理按钮对象
            this.saveFileDisposeButton.put(_requestPeople + _toSendFile, fb);//将该对象保存进hashtable
            style.addStylesToDocument(fileInfoDoc, fb);//添加样式
            fileInfoDoc.insertString(fileInfoDoc.getLength(), "  " + "\n",
                                     fileInfoDoc.getStyle("jpanel"));//把文件处理按钮对象显示在文件信息面板
            fileInfo.validate();//激活刷新显示
            this.tablePane.setSelectedComponent(filejscrollPane);//使文件面板为当前显示面板
          }
          catch (BadLocationException e) {
            e.printStackTrace();
          }
          if (tablePane.getSelectedIndex() != 2) {//文件面板出现提示图片
            tablePane.setIconAt(2, fileTableNew);
          }
        }
        else if (_message.startsWith("CANCEL_RECEIVED:")) {//取消接收
          String _toPeople = _message.substring(_message.indexOf(
              "CANCEL_RECEIVED:") + 16, _message.indexOf("#FILENAME#"));//取得该发送对象
          String _fileName = _message.substring(_message.indexOf("#FILENAME#") +
                                                10);//取得发送文件
          String key = _toPeople + _fileName;//取得用于保存发送方的“取消”对象的hashtable的key
          File file = new File(_fileName);//重构文件对象
          FileCancelButton fileCancelButton = (FileCancelButton)
              FileCancelButton.saveFileCancel.get(key);//取得hashtable当中相应的对象
          fileCancelButton.fileInfo.setText(_toPeople +
                                            constant.getLang("GG_qxwj") +
                                            file.getName() +
                                            constant.getLang("GG_dfs"));//设置提示信息
          fileCancelButton.cancelSendButton.setVisible(false);//设置“取消”按钮为不可见
          FileCancelButton.saveFileCancel.remove(fileCancelButton);//从hashtable中移除相应的对象
        }
        else if (_message.startsWith("CANCEL_SENDING:")) {//取消发送
          String _toPeople = _message.substring(_message.indexOf(
              "CANCEL_SENDING:") + 15, _message.indexOf("#FILENAME#"));//取得“发送文件请求方”对象
          String _fileName = _message.substring(_message.indexOf("#FILENAME#") +
                                                10);//取得发送的文件
          String key = _toPeople + _fileName;//取得key
          File file = new File(_fileName);//重构发送文件对象
          FileDisposeButton fileDisposeButton = (FileDisposeButton)
              FileDisposeButton.saveFileDisposeButton.get(key);//取得相应的文件处理按钮对象
          fileDisposeButton.fileInfo.setText(_toPeople +
                                             constant.getLang("GG_qxwj") +
                                             file.getName() +
                                             constant.getLang("GG_dfs"));//设置提示信息
          fileDisposeButton.buttonJPanel.setVisible(false);//设置“保存”“另存为”“拒绝”按钮为不可见
          FileDisposeButton.saveFileDisposeButton.remove(fileDisposeButton);//从hashtable中移除该对象
        }
        else if (_message.startsWith("CONSOLE")) {//控制台消息
          MessageDialog messageDialog = new MessageDialog(new JFrame(),
              _message);//控制台消息提示对话框
          messageDialog.setVisible(true);
          centerOnScreen(messageDialog);
        }
        else if (_message.startsWith("PEOPLE_LEAVE:")) {//用户离开
          String _peopleName = _message.substring(_message.indexOf(
              "PEOPLE_LEAVE:") + 13);
          publicDoc.insertString(publicDoc.getLength(), _peopleName + "离开\n",
                                 publicDoc.getStyle("regular"));//公共区显示用户离开信息
          model.removeElement(_peopleName);
          peopleList.validate();
          peopleTable.remove(_peopleName);//从hashtable中移除该对象
        }
        Thread.sleep(5);
      }
      catch (Exception e) {

      }
    }
  }

  public void stop() {//用户离开,线程停止
    try {
      this.socket.close();
      this.out.flush();
      this.out.close();
      this.in.close();
    }
    catch (Exception e1) {
      e1.printStackTrace();
    }

  }

  public static void main(String[] args) {
    ChatArea chatarea = new ChatArea(new Hashtable());
    JFrame f = new JFrame();
    f.getContentPane().add(chatarea);
    f.setVisible(true);
  }

  /**
   *
   * <p>Title:菜单和发送按钮事件内部类 </p>
   * <p>Description: </p>
   * <p>Copyright: Copyright (c) 2003</p>
   * <p>Company: </p>
   * @author not attributable
   * @version 1.0
   */
  class Action
      implements ActionListener {
    public void actionPerformed(ActionEvent e) {
      if (e.getSource() == sendMessageButton) {//发送按钮事件
        String peoples = "";
        try {
          String content = messageEditor.getMessage().trim();//取得发送消息
          if (content.length() > 0 && selectNameSB.length() > 0) {
            messageEditor.setMessage();
            messageEditor.messageTextPane.setFocusable(true);
            if (toPeople.contains("大家")) {//如果发送对象包含大家,则消息将发送给大家
              StringReader stringReader = new StringReader(
                  "<p><font color=\"#0080C0\">^您对大家说:^</font></p>" + content);
              editorKit.read(stringReader, publicDoc, publicDoc.getLength());//公共区显示发送的消息
              if (CONSOLESTATE == 1) {//用户选择发送控制台消息
                out.writeUTF("CONSOLE_PUBLIC_MESSAGE:" + "#MESSAGECONTENT#" +
                             content);//通过套接输出流来输出消息
              }
              else {//一般消息
                out.writeUTF("PUBLIC_MESSAGE:" + "#MESSAGECONTENT#" + content);
              }
            }
            else {//私人消息
              Enumeration enum = toPeople.elements();
              while (enum.hasMoreElements()) {//循环取得发送对象,然后构照发送对象字符串
                peoples = peoples + enum.nextElement() + "$";//以“$”作为分割符号
              }
              StringReader stringReader = new StringReader(
                  "<p><font color=\"#0080C0\">^您对" + selectNameSB +
                  "说:^</font></p>" + content);

              editorKit.read(stringReader, privateDoc, privateDoc.getLength());//私人区显示发送消息
              if (CONSOLESTATE == 1) {//用户选择控制台消息
                out.writeUTF("CONSOLE_PRIVATE_MESSAGE:" + "#TOPEOPLE#" +
                             peoples + "#MESSAGECONTENT#" + content);
              }
              else {//普通消息
                out.writeUTF("PRIVATE_MESSAGE:" + "#TOPEOPLE#" + peoples +
                             "#MESSAGECONTENT#" + content);
              }
            }
          }
          else {
            if (selectNameSB.length() <= 0) {//没有选择发送对象
              JOptionPane.showMessageDialog(null,
                                            constant.getLang("CA_qxxzfsdx"),
                                            constant.getLang("CA_tsxx"),
                                            JOptionPane.WARNING_MESSAGE);
            }
            else {//发送消息为空
              JOptionPane.showMessageDialog(null,
                                            constant.getLang("CA_fsxxbnwk"),
                                            constant.getLang("CA_tsxx"),
                                            JOptionPane.WARNING_MESSAGE);
            }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -