package cn.cdutetc.chatRoom_12.client;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
public class ChatClientFrame extends JFrame {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
// 窗口宽度
final int WIDTH = 700;
// 窗口高度
final int HEIGHT = 700;
String sendWhom;
// 创建发送按钮
JButton btnSend = new JButton("发送");
// 创建清除按钮
JButton btnClear = new JButton("清屏");
// 创建退出按钮
JButton btnExit = new JButton("退出");
// 创建文本输入框, 参数分别为行数和列数
JTextArea jtaSay = new JTextArea();
// 创建聊天消息框
JTextArea jtaChat = new JTextArea();
// 创建聊天消息框的滚动窗
JScrollPane jspChat = new JScrollPane(jtaChat);
// 当前在线列表的列标题
String[] colTitles = { "网名", "IP", "端口" };
// 当前在线列表的数据
String[][] rowData = null;
// 创建当前在线列表
JTable jtbOnline = new JTable(new DefaultTableModel(rowData, colTitles) {
// 表格不可编辑,只可显示
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
});
// 创建当前在线列表的滚动窗
JScrollPane jspOnline = new JScrollPane(jtbOnline);
// 创建消息接收者标签
JLabel lblReceiver = new JLabel("对谁说?");
// 创建设置网名标签
JLabel wmReceiver = new JLabel("请输入网名:");
//创建网名输入框
JTextField wmTextField = new JTextField(30);
// 创建设置名称
JButton btnSetName = new JButton("设置网名");
StringBuilder sb=new StringBuilder();
/**
* 构造方法,设置窗口
*/
public ChatClientFrame() {
// 标题
setTitle("聊天室");
// 大小
setSize(WIDTH, HEIGHT);
// 不可缩放
setResizable(false);
// 设置布局:不适用默认布局,完全自定义
setLayout(null);
// 设置按钮大小和位置
btnSend.setBounds(20, 600, 100, 60);
btnClear.setBounds(140, 600, 100, 60);
btnExit.setBounds(260, 600, 100, 60);
// 设置按钮文本的字体
btnSend.setFont(new Font("宋体", Font.BOLD, 18));
btnClear.setFont(new Font("宋体", Font.BOLD, 18));
btnExit.setFont(new Font("宋体", Font.BOLD, 18));
// 添加按钮
this.add(btnSend);
this.add(btnClear);
this.add(btnExit);
// 设置文本输入框大小和位置
jtaSay.setBounds(20, 460, 360, 120);
// 设置文本输入框字体
jtaSay.setFont(new Font("楷体", Font.BOLD, 16));
jtaSay.setLineWrap(true);
// 添加文本输入框
this.add(jtaSay);
// 聊天消息框自动换行
jtaChat.setLineWrap(true);
// 聊天框不可编辑,只用来显示
jtaChat.setEditable(false);
// 设置聊天框字体
jtaChat.setFont(new Font("楷体", Font.BOLD, 16));
// 设置滚动窗的水平滚动条属性:不出现
jspChat.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
// 设置滚动窗的垂直滚动条属性:需要时自动出现
jspChat.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
// 设置滚动窗大小和位置
jspChat.setBounds(20, 20, 360, 400);
// 添加聊天窗口的滚动窗
this.add(jspChat);
// 设置滚动窗的水平滚动条属性:不出现
jspOnline.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
// 设置滚动窗的垂直滚动条属性:需要时自动出现
jspOnline.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
// 设置当前在线列表滚动窗大小和位置
jspOnline.setBounds(420, 20, 250, 400);
// 添加当前在线列表
this.add(jspOnline);
// 设置标签大小和位置
lblReceiver.setBounds(20, 420, 300, 30);
this.add(lblReceiver);
wmReceiver.setBounds(420, 420, 250, 30);
this.add(wmReceiver);
wmTextField.setBounds(420, 460, 250, 30);
wmTextField.setFont(new Font("楷体", Font.BOLD, 16));
this.add(wmTextField);
// 设置按钮大小和位置
btnSetName.setBounds(420, 490, 160, 30);
// 设置按钮文本的字体
btnSetName.setFont(new Font("宋体", Font.BOLD, 16));
this.add(btnSetName);
btnExit.addActionListener((e)->{
try {
OutputStream out=Client.s.getOutputStream();
out.write("Exit/".getBytes());
System.exit(0);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
});
btnSetName.addActionListener((e)->{
OutputStream out;
try {
out = Client.s.getOutputStream();
String name=wmTextField.getText();
//ChangeName/jack
out.write(("ChangeName/"+name).getBytes());
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
});
btnClear.addActionListener((e)->{
jtaChat.setText("");
});
jtbOnline.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
DefaultTableModel model=(DefaultTableModel) jtbOnline.getModel();
int[] selectedRows=jtbOnline.getSelectedRows();
for(int i=0;i<selectedRows.length;i++)
{
sb.append((String)model.getValueAt(selectedRows[i], 0));
sb.append("-");
sb.append((String)model.getValueAt(selectedRows[i], 1));
sb.append(":");
sb.append((String)model.getValueAt(selectedRows[i],2));
sb.append(",");
}
String send=sb.toString();
sendWhom=send.substring(0,send.lastIndexOf(","));
lblReceiver.setText("对谁说:"+sendWhom);
}
});
btnSend.addActionListener((e)->{
StringBuilder sb1=new StringBuilder();
if(sb.toString()=="")
{
JOptionPane.showMessageDialog(null,"聊天对象不能为空");
}else
{
sb1.append("Chat/");
sb1.append(sendWhom);
sb1.append("/");
sb1.append(jtaSay.getText());
}
try {
OutputStream out=Client.s.getOutputStream();
out.write(sb1.toString().getBytes());
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally
{
jtaSay.setText("");
}
});
}
}