📄 chatframe.java
字号:
package com.chatroom;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.io.*;
import java.net.*;
import javax.swing.*;
import javax.swing.border.Border;
import com.sun.org.apache.xalan.internal.xsltc.runtime.Hashtable;
public class ChatFrame extends JFrame implements Runnable{
JPanel contentPane;
JMenuBar jMenuBar1 =new JMenuBar();
JMenu jMenuFile =new JMenu();
JMenuItem jMenuFileExit =new JMenuItem();
JMenu jMenuHelp =new JMenu();
JMenuItem jMenuHelpAbout =new JMenuItem();
BorderLayout borderLayout1=new BorderLayout();
JPanel jPanel1 =new JPanel();
JPanel jPanel2 =new JPanel();
JPanel jPanel3 =new JPanel();
JLabel jLabel1 =new JLabel();
JTextField niCheng =new JTextField();
JButton enter =new JButton();
JButton exit =new JButton();
/////////////////////////////////////////
Socket socket =null;
DataInputStream in =null;
DataOutputStream out=null;
Hashtable listTable =new Hashtable();
Thread thread =null;
String name =null;
JOptionPane jOptionPane1 =new JOptionPane();
JTextField sendText =new JTextField();
JLabel jLabel2 =new JLabel();
JButton send =new JButton();
BorderLayout borderLayout2 =new BorderLayout();
JPanel jPanel4 =new JPanel();
JPanel jPanel5 =new JPanel();
BorderLayout borderLayout3 =new BorderLayout();
TextArea chatArea =new TextArea();
BorderLayout borderLayout4 =new BorderLayout();
List chatList =new List();
Checkbox male =new Checkbox();
Checkbox female = new Checkbox();
CheckboxGroup checkboxGroup1 =new CheckboxGroup();
//////////////////////////////////////////////////
//定义Socket、输入输出流和线程
public ChatFrame() {
// TODO Auto-generated constructor stub
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try{
jbInit();
connectionNetwork();
}
catch(Exception e){
e.printStackTrace();
}
}
//组件初始化
private void jbInit() throws Exception {
// TODO Auto-generated method stub
contentPane =(JPanel)this.getContentPane();
contentPane.setLayout(borderLayout1);
this.setSize(new Dimension(400,300));
this.setTitle("网络聊天室");
jMenuFile.setText("File");
jMenuFileExit.setText("Exit");
jMenuFileExit.addActionListener(new ChatFrame_jMenuFileExit_ActionAdapter(this));
jMenuHelp.setText("Help");
jMenuHelpAbout.setText("About");
jMenuHelpAbout.addActionListener(new ChatFrame_jMenuHelpAbout_ActionAdapter(this));
jPanel1.setBackground(Color.pink);
jPanel2.setBackground(Color.orange);
jPanel2.setAlignmentY((float)0.5);
jPanel2.setDebugGraphicsOptions(0);
jPanel2.setLayout(borderLayout2);
jPanel3.setBackground(Color.pink);
jLabel1.setText("昵称");
niCheng.setPreferredSize(new Dimension(90,22));
niCheng.setText("");
enter.setText("进入");
enter.addActionListener(new ChatFrame_enter_actionAdapter(this));
exit.setText("退出");
exit.addActionListener(new ChatFrame_exit_actionAdapter(this));
sendText.setPreferredSize(new Dimension(200,22));
sendText.setText("");
sendText.setScrollOffset(0);
jLabel2.setText("发送内容");
send.setText("发送");
send.addActionListener(new ChatFrame_send_actionAdapter(this));
jPanel4.setLayout(borderLayout3);
jPanel5.setPreferredSize(new Dimension(50,9));
jPanel5.setLayout(borderLayout4);
male.setCheckboxGroup(checkboxGroup1);
male.setLabel("男");
female.setCheckboxGroup(checkboxGroup1);
female.setLabel("女");
checkboxGroup1.setSelectedCheckbox(male);
jPanel3.add(jLabel2,null);
jMenuFile.add(jMenuFileExit);
jMenuHelp.add(jMenuHelpAbout);
jMenuBar1.add(jMenuFile);
jMenuBar1.add(jMenuHelp);
contentPane.add(jPanel1,BorderLayout.NORTH);
jPanel1.add(jLabel1,null);
jPanel1.add(niCheng,null);
jPanel1.add(male,null);
jPanel1.add(female,null);
contentPane.add(jPanel2,BorderLayout.CENTER);
contentPane.add(jPanel3,BorderLayout.SOUTH);
jPanel3.add(sendText,null);
jPanel1.add(enter,null);
jPanel1.add(exit,null);
jPanel3.add(send,null);
jPanel2.add(jPanel4,BorderLayout.CENTER);
jPanel4.add(chatArea,BorderLayout.CENTER);
jPanel2.add(jPanel5,BorderLayout.EAST);
jPanel5.add(chatList,BorderLayout.CENTER);
this.setJMenuBar(jMenuBar1);
}
/* class ChatFrame_AboutBox{
public ChatFrame_AboutBox() {
// TODO Auto-generated constructor stub
}
}*/
//退出系统采单
public void jMenuFileExit_actionPerformed(ActionEvent e){
System.exit(0);
}
//帮助菜单
/* public void jMenuHelpAbout_actionPerformed(ActionEvent e){
ChatFrame_AboutBox dlg=new ChatFrame_AboutBox(this);
Dimension dlgSize =dlg.getPreferredSize();
Dimension frmSize =getSize();
Point loc =getLocation();
dlg.setLocation((frmSize.width-dlgSize.width)/2 + loc.x,(frmSize.height-dlgSize.height)/2+loc.y);
dlg.setModal(true);
dlg.pacK();
dlg.show();
}*/
protected void processWindowEvent(WindowEvent e){
super.processWindowEvent(e);
if(e.getID()==WindowEvent.WINDOW_CLOSING){
jMenuFileExit_actionPerformed(null);
}
}
//连接网络功能
void connectionNetwork(){
if(socket!=null&&in!=null&&out!=null){
try{
socket.close();
in.close();
out.close();
}
catch(Exception e){
e.printStackTrace();
}
}
//连接网络,创建输入输出流
try{
socket =new Socket("192.168.0.8",6000);
in =new DataInputStream(socket.getInputStream());
out =new DataOutputStream(socket.getOutputStream());
}
catch(Exception e){
jOptionPane1.showMessageDialog(null,"连接网络失败!请确定是否启动服务器","登录失败",jOptionPane1.ERROR_MESSAGE);
}
//创建线程
if(thread==null){
thread =new Thread(this);
thread.start();
}
}
public void run() {
// TODO Auto-generated method stub
String receiveMessage =null;
while(true){
if(in!=null){
try{
receiveMessage =in.readUTF();//接受信息
//处理聊天内容
if(receiveMessage.startsWith("聊天内容:")){
String chatContent =receiveMessage.substring(receiveMessage.indexOf(":")+1);
chatArea.append("\n"+chatContent);
}
//将聊天者的信息加到chatList上
else if(receiveMessage.startsWith("聊天者:")){
String people =receiveMessage.substring(receiveMessage.indexOf(":")+1,receiveMessage.indexOf("性别"));
String sex = receiveMessage.substring(receiveMessage.indexOf("性别")+2);
listTable.put(people, people+"("+sex+")");
chatList.add((String)listTable.get(people));
chatList.repaint();
}
//将聊天者的信息从chatList和listTable上删除
else if(receiveMessage.startsWith("用户离线:")){
String awayPeopleName =receiveMessage.substring(receiveMessage.indexOf(":")+1);
chatList.remove((String)listTable.get(awayPeopleName));
chatList.repaint();
chatArea.append("\n"+(String)listTable.get(awayPeopleName)+"离线");
listTable.remove(awayPeopleName);
}
Thread.sleep(5);
}
catch(IOException ee){
chatList.removeAll();
chatList.repaint();
listTable.clear();
jOptionPane1.showMessageDialog(null, "和服务器断开了!","接收信息失败!",jOptionPane1.INFORMATION_MESSAGE);
break;
}
catch(InterruptedException e){
}
}
}
}
//进入聊天室
void enter_actionPerformed(ActionEvent e){
if(socket!=null){
name=niCheng.getText();
String sex =checkboxGroup1.getSelectedCheckbox().getLabel();
if(socket!=null&&name!=null){
try{
out.writeUTF("姓名:"+name+"性别:"+sex);
}
catch(IOException ee){
jOptionPane1.showMessageDialog(null, "发送信息失败!请确定网络是否连通","发送信息错误",jOptionPane1.ERROR_MESSAGE);
}
}
jOptionPane1.showMessageDialog(null, "连接网络成功!您可以聊天了!","登录成功",jOptionPane1.INFORMATION_MESSAGE);
}
}
//退出聊天室
void exit_actionPerformed(ActionEvent e){
try {
out.writeUTF("用户离开:");
} catch (IOException ee) {
// TODO: handle exception
}
finally{
System.exit(0);
}
}
//发送聊天信息
void send_actionPerformed(ActionEvent e){
String sendMessage ="";
sendMessage=sendText.getText();
if(sendMessage.length()>0){
try {
out.writeUTF("聊天:"+name+"说:"+sendMessage);
sendText.setText("");
} catch (IOException event) {
// TODO: handle exception
}
}
}
}
//以下代码完成注册事件监听器功能,与菜单栏的功能对应
class ChatFrame_jMenuFileExit_ActionAdapter implements ActionListener{
ChatFrame adapter;
ChatFrame_jMenuFileExit_ActionAdapter(ChatFrame adapter) {
// TODO Auto-generated constructor stub
this.adapter =adapter;
}
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
adapter.jMenuFileExit_actionPerformed(e);
}
}
class ChatFrame_jMenuHelpAbout_ActionAdapter implements ActionListener{
ChatFrame adapter;
ChatFrame_jMenuHelpAbout_ActionAdapter(ChatFrame adapter) {
// TODO Auto-generated constructor stub
this.adapter =adapter;
}
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
// adapter.jMenuHelpAbout_actionPerformed(e);
}
}
class ChatFrame_enter_actionAdapter implements ActionListener{
ChatFrame adapter;
ChatFrame_enter_actionAdapter(ChatFrame adapter) {
this.adapter =adapter;
// TODO Auto-generated constructor stub
}
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
adapter.enter_actionPerformed(e);
}
}
class ChatFrame_exit_actionAdapter implements ActionListener{
ChatFrame adapter;
ChatFrame_exit_actionAdapter(ChatFrame adapter) {
// TODO Auto-generated constructor stub
this.adapter =adapter;
}
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
adapter.exit_actionPerformed(e);
}
}
class ChatFrame_send_actionAdapter implements ActionListener{
ChatFrame adapter;
ChatFrame_send_actionAdapter(ChatFrame adapter) {
// TODO Auto-generated constructor stub
this.adapter =adapter;
}
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
adapter.send_actionPerformed(e);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -