📄 chatarea.java
字号:
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 + -