⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 client.java

📁 用java写的聊天室
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package client;

//客户端代码
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
import java.net.*;
import java.io.*;
import java.util.*;
import javax.swing.text.*;
import client.about.*;
import data.DataPack;

public class Client extends JFrame
{
	//入口函数
	public static void main(String args[])
	{
		SetFont.setFont(new Font("宋体", 0, 12));
		new Client();
	}

	//定义菜单条
	private JMenu menuBegin=new JMenu("选择服务器");
	private JMenuItem LJItem=new JMenuItem("连接服务器");
	private JMenuItem DKItem=new JMenuItem("断开连接");
	private JMenuItem TCItem=new JMenuItem("退出");
	private JMenu menuAbout=new JMenu("关于");
	private JMenuItem AboutItem=new JMenuItem("关于本程序");
	JMenuBar menuBar=null;

	//Action事件的定义
	public  Action [] ac=null;
	public  Action  copy=null;
	public  Action paste=null;
	//定义右键菜单
	 JPopupMenu Pmenu=new JPopupMenu();
		JMenuItem []ji=new JMenuItem[4];
	 String []pmItemStr={"复制    Ctrl+C","粘贴    Ctrl+V","背景色设置","默认背景色"};


	//左边的一块面板,用于放置用户在线信息情况
	private JPanel leftPane=new JPanel();

	//放置一张图片
	private JLabel leftLab=new JLabel(new ImageIcon(Client.class.getResource("icon1/top.jpg")));

	//显示当前登录的用户名
	private JLabel userLab=new JLabel("当前用户",new ImageIcon(Client.class.getResource("icon1/head.jpg")),JLabel.LEFT);

	//显示当前所有在线用户
	private JLabel allUserLab=new JLabel("当前所有在线用户    0      ");

	//用于计算当前有多少用户在线
	private int allUserCount=0;


	//定义显示当前聊天室的所有人员列表
	private DefaultListModel dl=new DefaultListModel();
	private DefaultComboBoxModel dm=new DefaultComboBoxModel();
	private JList list=new JList(dl);

	//定义用户的聊天信息区的面板
	private JPanel messagePane=new JPanel();

	//定义表情,文字输入框的面板
	private JPanel ComponentPane=new JPanel();

	//定义显示用户的聊天信息TextPane
	private JTextPane txtPane=new JTextPane();

	//定义发送信息用的组件
	private JLabel []lab=new JLabel[2];
	private String []labStr={"我   对","要说的话"};

	//显示所有在线用户名单
	private JComboBox allU=new JComboBox();
	private DefaultComboBoxModel dcdmAllU=new DefaultComboBoxModel();

	private JComboBox [] jcomb=new JComboBox[3];
	private DefaultComboBoxModel dcdm1=new DefaultComboBoxModel();
	private DefaultComboBoxModel dcdm2=new DefaultComboBoxModel();
	private String [] str={"黑色","红色","橙色","蓝色","蓝绿色","绿色","红紫色","粉红色","黄色"};
	private DefaultComboBoxModel dcdm3=new DefaultComboBoxModel();
	private  String[] biaoqing ={"(无)","笑着说","哭着说","微笑道","一把鼻涕一把泪地痛诉道","嚎嚎大哭道",
								"打XX了一拳,喝一声道","踢了XX一脚,大吼","吻了XX一下,深情地说","紧张地说",
								"不屑一顾地说","低声下气地说","冷嘲热讽XX道","面无表情地说"};

	private JCheckBox [] jcheckb=new JCheckBox[3];
	private String [] jcheckbStr={"滚屏","分屏","私聊"};

	//输入要发送的话语的文本框
	private JTextField jtf=new JTextField();

	//发言,离开按钮
	private JButton sendBtn=new JButton("发言");
	private JButton exitBtn=new JButton("离开");

	//背景色设置按钮
	private JButton YSBtn=new JButton("背景色设置");
	private JButton MoBtn=new JButton("默认背景色");


	private String load1 ="【欢迎】      欢迎来到本聊天室";
	private String load2 ="【欢迎】````````/;~~|`````````*@@@@@,````````````````";
	private String load3 ="【欢迎】```````|;`66|_````````@@@@@@@@,``````````````";
	private String load4 ="【欢迎】```````C`````_)```````aa`@@@@@@``````````````";
	private String load5 ="【欢迎】```````|```_|````````{_```?@@@@``````````````";
	private String load6 ="【欢迎】````````)``/``````````='`@@@@~```````````````";
	private String load7 ="【欢迎】```````|``\```````````\`(```````````````````";
	private String load8 ="【欢迎】``````||``|Y|`````````/```\``````````````````";
	private String load9 ="【欢迎】``````||``|.|````````/`|``||``````````````````";
	private String load10="【欢迎】``````||``|.|````````\`|``||`````````````````";
	private String load11="【欢迎】``````||``|.|`````````\|__|\`````````````````";
	private String load12="【欢迎】``````:|``|=:`````````||__|`\````````````````";
	private String load13="【欢迎】``````||_`|`|`````````|(((```|```````````````";
	private String load14="【欢迎】  ---------------------";

	//网络
	private DataPack dp=null;
	private Socket sc=null;
	private ObjectInputStream ois=null;
	private ObjectOutputStream oos=null;

	//线程
	private RecTh t=null;


	//定义进入聊天室的昵称,服务器的地址,端口号
	private String name="";
	private String serverIP="";
	private int serverPort=0;

	//属性设置
	public static SimpleAttributeSet sa1=new SimpleAttributeSet();

	//光标样式
	Cursor defaultCur=new Cursor(DEFAULT_CURSOR);
	Cursor handCur=new Cursor(HAND_CURSOR);


	//构造器
	public Client()
	{
		//窗体属性
		setSize(1024,740);
		setTitle("欢迎来到本聊天室!");
		//构件菜单
		createMenu();

		//设置LIST的CellRenderer
		list.setCellRenderer(new hh());

		//本窗体绑定退出事件
		this.addWindowListener(new WindowAdapter()
			{
				public void windowClosing(WindowEvent e)
				{
					closeSocket();
					System.exit(0);
				}
			});

		//得到JTextPane的事件
		ac=txtPane.getActions();
		for(int i=0;i<ac.length;i++)
		{
			String tmp=(String)(ac[i].getValue(Action.NAME));

			if(tmp.equals("copy-to-clipboard"))
			{
				copy=ac[i];
			}
			if(tmp.equals("paste-from-clipboard"))
			{
				paste=ac[i];
			}
		}
		//添加右键菜单
		 for(int i=0;i<ji.length;i++)
		 {
			 ji[i]=new JMenuItem(pmItemStr[i]);
			 ji[i].addActionListener(new ActionEv());
		 }
		 ji[0].addActionListener(copy);
		 ji[1].addActionListener(paste);
		 Pmenu.add(ji[0]);Pmenu.add(ji[1]);Pmenu.addSeparator();Pmenu.add(ji[2]);Pmenu.add(ji[3]);

		 //绑定右键菜单
		txtPane.addMouseListener(new MouseListener()
			{
				public void mouseClicked(MouseEvent e)
				{
					if(e.isPopupTrigger())
					{
						Pmenu.setVisible(true);
					}
				}
				public void mouseEntered(MouseEvent e){}
				public void mouseExited(MouseEvent e){}
				public void mousePressed(MouseEvent e){}
				public void mouseReleased(MouseEvent e)
				{
					if(e.isPopupTrigger())
					{
						Pmenu.show(txtPane,e.getX(),e.getY());
					}
				}
			});

		//启动是加载的字符串
		txtPane.replaceSelection(load14+"\n");
		txtPane.replaceSelection(load13+"\n");
		txtPane.replaceSelection(load12+"\n");
		txtPane.replaceSelection(load11+"\n");
		txtPane.replaceSelection(load10+"\n");
		txtPane.replaceSelection(load9+"\n");
		txtPane.replaceSelection(load8+"\n");
		txtPane.replaceSelection(load7+"\n");
		txtPane.replaceSelection(load6+"\n");
		txtPane.replaceSelection(load5+"\n");
		txtPane.replaceSelection(load4+"\n");
		txtPane.replaceSelection(load3+"\n");
		txtPane.replaceSelection(load2+"\n");
		txtPane.replaceSelection(load1+"\n");

		//设置文本编辑区的属性
		txtPane.setEditable(false);
		txtPane.setFont(new Font("宋体",0,15));
		txtPane.setSelectionColor(new Color(153,153,255));
		txtPane.setBackground(new Color(132,145,174,50).brighter());


		//标签初始化
		for(int i=0;i<lab.length;i++)
		{
			lab[i]=new JLabel(labStr[i]);
			ComponentPane.add(lab[i]);
		}

		//加载图片
		for(int i=0;i<23;i++)
		{
			dcdm1.addElement(new ImageIcon(Client.class.getResource("icon1/"+i+".gif")));
		}
		//加载颜色字符
		for(int i=0;i<str.length;i++)
		{
			dcdm2.addElement(str[i]);
		}
		//加载动作字符
		for(int i=0;i<biaoqing.length;i++)
		{
			dcdm3.addElement(biaoqing[i]);
		}

		//JComboBox的初始化
		for(int i=0;i<jcomb.length;i++)
		{
			jcomb[i]=new JComboBox();
			ComponentPane.add(jcomb[i]);
		}
		jcomb[1].setModel(dcdm1);
		jcomb[2].setModel(dcdm2);
		jcomb[0].setModel(dcdm3);
		allU.setModel(dcdmAllU);

		//JCheckBox的初始化
		for(int i=0;i<jcheckb.length;i++)
		{
			jcheckb[i]=new JCheckBox(jcheckbStr[i]);
			jcheckb[i].setForeground(Color.blue);
			jcheckb[i].setBackground(new Color(221,117,162).brighter());
			ComponentPane.add(jcheckb[i]);
		}


		//设置各组件的属性
		lab[0].setForeground(Color.blue);
		lab[1].setForeground(Color.blue);

		sendBtn.setMargin(new Insets(0,0,0,0));
		exitBtn.setMargin(new Insets(0,0,0,0));
		YSBtn.setMargin(new Insets(0,0,0,0));
		MoBtn.setMargin(new Insets(0,0,0,0));

		userLab.setForeground(Color.red);
		userLab.setFont(new Font("宋体",0,13));
		allUserLab.setOpaque(true);
		allUserLab.setForeground(Color.white);
		allUserLab.setBackground(Color.red);

		list.setFont(new Font("宋体",0,13));
		list.setForeground(new Color(255,102,153));
		list.setBackground(new Color(240,240,240));
		list.setSelectedIndex(0);

		//设置各组件的位置
		lab[0].setBounds(15,5,80,25);allU.setBounds(75,7,100,20);
		jcomb[0].setBounds(180,7,160,20);jcomb[1].setBounds(355,7,80,20);
		jcomb[2].setBounds(450,7,80,20);
		jcheckb[0].setBounds(530,5,50,25);jcheckb[1].setBounds(585,5,50,25);
		YSBtn.setBounds(650,5,80,23);MoBtn.setBounds(735,5,80,23);
		lab[1].setBounds(15,45,50,25);jtf.setBounds(80,45,450,23);
		jcheckb[2].setBounds(530,45,50,25);
		sendBtn.setBounds(590,45,50,23);exitBtn.setBounds(650,45,50,23);
		ComponentPane.setPreferredSize(new Dimension(1024,100));
		ComponentPane.setBackground(new Color(221,117,162).brighter());
		ComponentPane.setLayout(null);
		ComponentPane.add(jtf);ComponentPane.add(sendBtn);ComponentPane.add(exitBtn);
		ComponentPane.add(YSBtn);ComponentPane.add(MoBtn);
		ComponentPane.add(allU);

		//聊天信息区的面板添加聊天信息TextPane和表情,文字输入框的面板
		messagePane.setLayout(new BorderLayout());
		messagePane.add(new JScrollPane(txtPane),BorderLayout.CENTER);
		messagePane.add(ComponentPane,BorderLayout.SOUTH);

		leftPane.setLayout(new FlowLayout(FlowLayout.LEFT,1,0));
		leftPane.setPreferredSize(new Dimension(140,600));
		leftPane.setMaximumSize(new Dimension(140,600));
		leftPane.add(leftLab);
		leftPane.add(userLab);
		leftPane.add(allUserLab);
		leftPane.add(list);

		Container con=getContentPane();
		con.setLayout(new BorderLayout());
		JScrollPane jsp=new JScrollPane(leftPane);
		jsp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
		jsp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		con.add(jsp,BorderLayout.WEST);
		con.add(messagePane,BorderLayout.CENTER);
		setVisible(true);

		//事件的绑定
		exitBtn.addActionListener(new ActionEv());
		sendBtn.addActionListener(new ActionEv());
		YSBtn.addActionListener(new ActionEv());
		MoBtn.addActionListener(new ActionEv());
		jtf.addActionListener(new ActionEv());
		jcomb[2].addActionListener(new ActionEv());

		//绑定用户名字LIST事件
		list.addMouseListener(new MouseListener()
			{
				public void mouseClicked(MouseEvent e)
				{
					String listValue=(String)list.getSelectedValue();
					dcdmAllU.setSelectedItem(listValue);
				}
				public void mouseEntered(MouseEvent e)
				{
					list.setCursor(handCur);
				}
				public void mouseExited(MouseEvent e)
				{
					list.setCursor(defaultCur);
				}
				public void mousePressed(MouseEvent e)
				{}
				public void mouseReleased(MouseEvent e)
				{
				}
			});
	}

	//退出时,关闭 Socket方法
	public void closeSocket()
	{
		try
		{
			if(sc!=null)
			{
				sc.close();
				sc=null;
				ois=null;
				oos=null;
			}
		}catch(Exception e)
		{
			System.out.println("err0:"+e);
		}
	}

	//生成菜单条方法
	public void createMenu()
	{
		menuBar=new JMenuBar();
		menuBar.setBackground(new Color(160,178,255));
		menuBegin.add(LJItem);
		menuBegin.add(DKItem);
		menuBegin.addSeparator();
		menuBegin.add(TCItem);
		menuAbout.add(AboutItem);
		LJItem.addActionListener(new MenuEv());
		DKItem.addActionListener(new MenuEv());
		TCItem.addActionListener(new MenuEv());
		AboutItem.addActionListener(new MenuEv());
		menuBar.add(menuBegin);
		menuBar.add(menuAbout);
		DKItem.setEnabled(false);
		setJMenuBar(menuBar);
	}

	//listCellRenderer
	class hh implements ListCellRenderer
	{
		public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
		{
			if(index==0)
			{
				JLabel bb=new JLabel((String)value);
				bb.setForeground(new Color(221,117,162));
				bb.setToolTipText("选择该用户就可以对他发送信息!");
				if(isSelected==true)
				{
					bb.setForeground(Color.blue);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -