package Chat;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.StyledDocument;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.util.Calendar;
import java.io.*;
public class ChatFrame extends JFrame implements ActionListener, ItemListener,
Runnable, ListSelectionListener {
private static final long serialVersionUID = 1L;
String IP;
// 好友列表
private JList peopleList;
private JButton refurbishButton;
public DefaultListModel listModel;
int port = 6200;
private Box leftbox = null;
private Box rightbox = null;
private Box leftrightbox = null;
private Box rightleftbox = null;
// 菜单栏
private Box box = null; // 放输入组件的容器
private StyledDocument doc = null;
private JTextPane commonArea = null; // 公共发言区
private JTextPane myMsgArea = null;// 我的频道发言区
public JComboBox perponsComboBox; // 下拉菜单
private JTextArea inMsgField; // 发言输入框
private JCheckBox privateTalk; // 私聊checkbox
private boolean privateTalkFlag = false; // 是否是私聊,默认值为假
private JButton sentButton; // 发送消息按钮
public BufferedReader in;
public PrintWriter out;
public String myName;
private String withWho = "所有人";
String outmsg;// 发送的信息
String mywords;// 要说的话*
JPanel centerPanel;
JScrollPane commonAreaScroll;
JScrollPane myMsgAreaScroll;
JScrollPane inMsgFieldScroll;
public ChatFrame(String host) {
super(host + "的聊天室");
try { // 使用Windows的界面风格
UIManager
.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (Exception e) {
e.printStackTrace();
}
myName = host;
try {
InetAddress addr = InetAddress.getLocalHost();
IP = addr.getHostAddress().toString();// 获得本机IP
} catch (Exception e) {
System.out.print("无法获取本地主机");
}
JPanel eastPanel = new JPanel(new BorderLayout());
JLabel title = new JLabel("我的在线好友");
listModel = new DefaultListModel();// 实现 java.util.Vector API 在发生更改时通知
// ListDataListener
peopleList = new JList(listModel);
peopleList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);// 设置单选还是多选
JScrollPane ListScrollPane = new JScrollPane(peopleList);
ListScrollPane.setPreferredSize(new Dimension(150, 400));
refurbishButton = new JButton("刷新列表");
leftrightbox = Box.createHorizontalBox(); // 行结构
eastPanel.add(title, BorderLayout.NORTH);
eastPanel.add(ListScrollPane, BorderLayout.CENTER);
eastPanel.add(refurbishButton, BorderLayout.SOUTH);
leftrightbox.add(eastPanel);
refurbishButton.addActionListener(this);// 监听刷新按钮
peopleList.addListSelectionListener(this);
Box rightabove = Box.createVerticalBox();
rightabove.add(leftrightbox);
rightbox = Box.createVerticalBox();// 竖结构
rightbox.add(Box.createVerticalStrut(10));
rightbox.add(rightabove);
rightbox.add(Box.createVerticalStrut(10));
rightbox.add(Box.createVerticalStrut(10));
rightleftbox = Box.createHorizontalBox();
Box rightmiddle = Box.createVerticalBox();
rightmiddle.add(rightleftbox);
rightbox.add(rightmiddle, BorderLayout.CENTER);
rightbox.setBackground(new Color(0, 0, 255));
// 聊天室右侧
JPanel upperPanel = new JPanel();
box = Box.createVerticalBox(); // 竖结构
Box box_2 = Box.createVerticalBox(); // 横结构
box.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8)); // 8个的边距
upperPanel.add(box, BorderLayout.SOUTH);
// 中间聊天室两个窗口
Border brd = BorderFactory.createMatteBorder(// 边框修饰色
2, 2, 2, 1, new Color(125, 161, 253));
centerPanel = new JPanel(new BorderLayout());
commonArea = new JTextPane();
commonArea.setBorder(brd);
commonArea.setEditable(false);
commonArea.getScrollableUnitIncrement(new Rectangle(10, 20),
SwingConstants.VERTICAL, -2);
commonAreaScroll = new JScrollPane(commonArea);
commonAreaScroll
.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);// 设置滚动条什么时候出现
commonAreaScroll
.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
commonAreaScroll.setBorder(BorderFactory.createTitledBorder("群聊区"));
box_2.add(commonAreaScroll);
box_2.add(Box.createVerticalStrut(2));
myMsgArea = new JTextPane();
myMsgArea.setBorder(brd);
myMsgArea.setEditable(false);
myMsgAreaScroll = new JScrollPane(myMsgArea);
myMsgAreaScroll
.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
myMsgAreaScroll
.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
myMsgAreaScroll.setBorder(BorderFactory.createTitledBorder("私聊区"));
box_2.add(myMsgAreaScroll);
centerPanel.add(box_2);
// 自己的编辑区
JPanel centerLowerPanel = new JPanel(new BorderLayout());
JPanel tempPanel1 = new JPanel(new BorderLayout());
JPanel tempPanel2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
JLabel withWho = new JLabel("对");
perponsComboBox = new JComboBox();
perponsComboBox.addItem("所有人");
privateTalk = new JCheckBox("私聊");
inMsgField = new JTextArea(3, 2);
inMsgField.setBorder(brd);
inMsgField.setBackground(new Color(248, 243, 209));// 设置聊天框体的颜色
sentButton = new JButton("发送");
inMsgFieldScroll = new JScrollPane(inMsgField);
inMsgFieldScroll
.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
inMsgFieldScroll.setBorder(BorderFactory.createTitledBorder("编辑区"));
tempPanel1.add(inMsgFieldScroll, BorderLayout.CENTER);
sentButton.setBackground(Color.WHITE);
tempPanel2.add(withWho);
tempPanel2.add(new JLabel(" "));
tempPanel2.add(perponsComboBox);
tempPanel2.add(new JLabel(" "));
tempPanel2.add(privateTalk);
tempPanel2.add(new JLabel(" "));
tempPanel2.add(new JLabel(" "));
tempPanel2.add(sentButton);
tempPanel2.add(new JLabel(""));
centerLowerPanel.add(tempPanel1, BorderLayout.CENTER);
centerLowerPanel.add(tempPanel2, BorderLayout.SOUTH);
centerPanel.add(centerLowerPanel, BorderLayout.SOUTH);
// 最下面的面板(South)
JLabel BordBottomLabel = new JLabel();
Icon BordBottom = new ImageIcon("images\\BordBottom.gif");
BordBottomLabel.setIcon(BordBottom);
leftbox = Box.createVerticalBox();
leftbox.add(upperPanel, BorderLayout.NORTH);
leftbox.add(centerPanel, BorderLayout.CENTER);
leftbox.add(BordBottomLabel, BorderLayout.SOUTH);
this.add(leftbox, BorderLayout.CENTER);
this.add(rightbox, BorderLayout.EAST);
sentButton.addActionListener(this); // 监听发送按钮
perponsComboBox.addActionListener(this);// 监听下拉菜单
privateTalk.addItemListener(this); // 监听多选框状态
inMsgField.requestFocus();
this.setLocation(450, 50); // 居中
this.setSize(600, 600);
this.setVisible(true);
this.addWindowListener(new WindowAdapter() { // 匿名类 监听窗口关闭时间
public void windowClosing(WindowEvent event) {
shutDown();
}
});
}
public void init(BufferedReader in, PrintWriter out) {
this.in = in;
this.out = out;
Thread th = new Thread(this);
th.start();
}
public void run() {
String inmsg;
while (true) {
try {
if ((inmsg = in.readLine()) != null) {
// 已经在聊天室里的人显示到列表中
if (inmsg.startsWith("old")) {
String[] userInfo = inmsg.split("&");
listModel.addElement(userInfo[1]); // 更新用户列表
} else if (inmsg.startsWith("new")) { // 接收第一次服务器发送欢迎信息
String[] userInfo = inmsg.split("&");
listModel.addElement(userInfo[1]); // 更新用户列表 new &
// zhangsan &
// boy
insert(commonArea, userInfo[1] + "上线了");
insert(myMsgArea, userInfo[1] + "上线了");
} e