package chatroom;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Date;
import java.util.LinkedList;
import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class Chat extends Thread {
private DatagramSocket socket;
private String name;
private String ip;
private int port;
private AppletofChat chatClient;
Thread clientThread;
public Chat(String s, String ipval, int portval) {
name = s;
ip = ipval;
port = portval;
chatClient = new AppletofChat(s);
chatClient.init();
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public void setSocket(DatagramSocket socketval) {
socket = socketval;
}
/**
*
* @author liwenjie 聊天窗口类
*/
private class AppletofChat extends JFrame// 是JFrame的子类
{
private static final long serialVersionUID = 1L;
// 用来放置聊天记录窗口的面板
private JPanel sendToPanel;
// 用来放置聊天信息的面板
private JPanel messagePanel;
// 菜单条
private JMenuBar menuBar;
// 两个菜单项
private JMenu menu1, menu2;
// 菜单项的子菜单
private JMenuItem menuItem1, menuItem2, menuItem3;
// 聊天记录窗口
private JTextArea privateContentOfChat;
// 三个标签提示
private JLabel prompt1, prompt2;
// 用户列表
private JTextField sendToUser;
// 聊天信息
private JTextField message;
// 发送按钮
private JButton send;
// 私有聊天滚动条
private JScrollPane privateScorllPane;
// 存有发送列表,发送信息,发送按钮的面板
private JPanel messageAndSend;
// 存有聊天信息的面板
private JPanel contentText1;
//
private JPanel userListPanel;
// 在线用户列表
private JList userList1;
// 好友列表
private JList friendList1;
// 带滚动条的在线用户列表
private JScrollPane userListScorllPane;
//
private JScrollPane friendListScrollPane;
// 在线用户列表标签
private JLabel userListLable;
// 好友用户列表标签
private JLabel friendListLable;
// 左边面板
private JSplitPane splitPane;
//
private LinkedList<UserInfomation> userList = new LinkedList<UserInfomation>();
//
private DefaultListModel userListMode;
//
private DefaultListModel friendListMode;
//
public AppletofChat(String s) {
// 设定窗口标题
super(s + "的聊天窗口");
// 生成公共聊天内容窗口
privateContentOfChat = new JTextArea(10, 30);
// 设定该文本区域不可编辑
privateContentOfChat.setEditable(false);
// 生成菜单
menuBar = new JMenuBar();
// 生成file菜单
menu1 = new JMenu("File");
// 设置快捷键
menu1.setMnemonic('F');
// 生成action菜单
menu2 = new JMenu("Action");
// 设置快捷键
menu2.setMnemonic('A');
// 生成file的子菜单save
menuItem1 = new JMenuItem("Save");
// 设置快捷键
menuItem1.setMnemonic('S');
// 保存菜单事件注册
menuItem1.addActionListener(new SaveFiles());
// 生成file的子菜单exit
menuItem2 = new JMenuItem("Exit");
// 设置快捷键
menuItem2.setMnemonic('X');
// 退出菜单处理
menuItem2.addActionListener(new exitHandle());
// 生成action的子菜单send
menuItem3 = new JMenuItem("Send");
// 设置快捷键
menuItem3.setMnemonic('E');
// send菜单事件注册
menuItem3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == menuItem3) {
if (message.getText().equals("")) {
JOptionPane.showMessageDialog(null, "不能发送空消息!",
"错误", JOptionPane.ERROR_MESSAGE);
} else {
if (sendToUser.getText().equals("everyone"))
sendMessageToEveryone();
else {
String nameval = userList.get(
userList1.getSelectedIndex() - 1)
.getName();
privateContentOfChat.append("\r\n【你】对【"
+ nameval + "】说:" + message.getText());
try {
sendMessageToOther();
} catch (IOException e2) {
System.err.println();
}
message.setText("");
}
}
}
}
});
// 生成标签send to
prompt1 = new JLabel("Send To");
// 生成标签Message
prompt2 = new JLabel("Message");
// 生成用户列表
sendToUser = new JTextField("everyone");
sendToUser.setEditable(false);
// 设置用户列表最多显示个数,若超过则自动加滚动条
// 生成信息框
message = new JTextField(10);
// 文本框事件处理,输入完后敲回车,直接发送
message.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (e.getSource() == message) {
if (message.getText().equals("")) {
JOptionPane.showMessageDialog(null, "不能发送空消息!",
"错误", JOptionPane.ERROR_MESSAGE);
} else {
if (sendToUser.getText().equals("everyone"))
sendMessageToEveryone();
else {
String nameval = userList.get(
userList1.getSelectedIndex() - 1)
.getName();
privateContentOfChat.append("\r\n【你】对【"
+ nameval + "】说:" + message.getText());
try {
sendMessageToOther();
} catch (IOException e2) {
System.err.println();
}
message.setText("");
}
}
}
}
});
// 生成发送按钮
send = new JButton("Send");
// 按钮事件注册
send.addMouseListener(new sendHandle());
// 生成带有滚动条的聊天窗口
privateScorllPane = new JScrollPane(privateContentOfChat);
// 生成聊天信息的窗口容器
sendToPanel = new JPanel();
sendToPanel.setLayout(new BoxLayout(sendToPanel, BoxLayout.X_AXIS));
// 用户列表数组
userListMode = new DefaultListModel();
userListMode.addElement("everyone");
friendListMode = new DefaultListModel();
friendListMode.addElement("everyone");
// 生成发送消息的窗口容器
messagePanel = new JPanel();
messagePanel
.setLayout(new BoxLayout(messagePanel, BoxLayout.Y_AXIS));
// 用户列表生成,并加上滚动条
userList1 = new JList(userListMode);
userList1.setVisibleRowCount(10);
userList1.setBackground(Color.yellow);
userList1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
userList1.addListSelectionListener(new listSelectionHandle());
userListScorllPane = new JScrollPane(userList1);
userListPanel = new JPanel();
userListPanel.setLayout(new BoxLayout(userListPanel,
BoxLayout.Y_AXIS));
//
friendList1 = new JList(friendListMode);
friendList1.addListSelectionListener(new listSelectionHandle());
friendList1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
friendList1.setVisibleRowCount(10);
friendList