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

📄 chatclient.java

📁 JAVA 聊天室源码
💻 JAVA
字号:
package liaotshi2;



import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

import javax.swing.event.*;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.*;
import java.net.*;
import java.io.*;

/**
 * ListSelectionListener 是实现JList类事件的接口 ItemListener 是实现JCheckBox类事件的接口
 * ActionListener 是实现JButton类,JComboBox类事件的接口
 */


// chatClient类为聊天室的登陆界面类,是个applet

public class chatClient extends JApplet implements ListSelectionListener, ActionListener,
		ItemListener {
	JPanel panel,mpanel;

	JLabel label1, label2, label3, label4;

	JButton login,register;
	GridBagLayout gbObject;
	GridBagConstraints gbc;
	JTextField custName;
	JPasswordField custPassword;
	Socket socket;
	PrintStream toServer;

	JPanel panelObject;
	JTextArea jtextarea;
	JScrollPane jscrollpane;// 设置滚动条
	GridBagLayout cgbObject;
	GridBagConstraints cgbc;
	JList listCust;
	DefaultListModel model;// 显示在线用户列表的类,放在JList当中
	JScrollPane jscrollpane1;
	JCheckBox check1, check2;
	JTextField textCust, textMessage;
	JComboBox box1, box2, box3;
	JButton buttonSend;
	String str;
	static int flag = 1;
	static String ccustName = null;

	Socket soc;
	PrintStream ps;
	Listen listen = null;
	
	public chatClient() {

		try {
			socket = new Socket("127.0.0.1", 7894);
			toServer = new PrintStream(socket.getOutputStream());

		} catch (IOException e) {
			JOptionPane.showMessageDialog(null, "不在聊天时段!请注意开放时间09:00——22:00", "警告",
					JOptionPane.ERROR_MESSAGE);
			System.out.println("Error1:" + e);
		}
		mpanel = new JPanel();
		panel = new JPanel();
		gbObject = new GridBagLayout();
		gbc = new GridBagConstraints();
		panel.setLayout(gbObject);
		panel.setBackground(Color.white);
		label1 = new JLabel("欢迎光临java聊天室");
		Font font = new Font("宋体", Font.BOLD, 15);
		Font font1 = new Font("宋体", Font.BOLD, 13);
		label1.setFont(font);

		label2 = new JLabel("名字");
		label3 = new JLabel("密码");
		label4 = new JLabel("游客登陆不需密码");
		label4.setFont(font1);

		login = new JButton("登陆");
		register= new JButton("注册");
		custName = new JTextField(10);
		custPassword = new JPasswordField(10);

		login.addActionListener(this);
		register.addActionListener(this);

		gbc.gridx = 3;
		gbc.gridy = 0;

		gbObject.setConstraints(label1, gbc);
		panel.add(label1);

		gbc.anchor = GridBagConstraints.WEST;
		gbc.gridx = 1;
		gbc.gridy = 10;
		gbObject.setConstraints(label2, gbc);
		panel.add(label2);

		gbc.anchor = GridBagConstraints.WEST;
		gbc.gridx = 3;
		gbc.gridy = 10;
		gbObject.setConstraints(custName, gbc);
		panel.add(custName);

		gbc.anchor = GridBagConstraints.WEST;
		gbc.gridx = 1;
		gbc.gridy = 50;
		gbObject.setConstraints(label3, gbc);
		panel.add(label3);

		gbc.anchor = GridBagConstraints.WEST;
		gbc.gridx = 3;
		gbc.gridy = 50;
		gbObject.setConstraints(custPassword, gbc);
		panel.add(custPassword);

		gbc.anchor = GridBagConstraints.WEST;
		gbc.gridx = 5;
		gbc.gridy = 50;
		gbObject.setConstraints(label4, gbc);
		panel.add(label4);

		gbc.anchor = GridBagConstraints.WEST;
		gbc.gridx = 3;
		gbc.gridy = 100;
		gbObject.setConstraints(login, gbc);
		panel.add(login);
		panel.add(register);
		
		
		//聊天panel
		

		Font cfont = new Font("宋体", Font.PLAIN, 12);
		Font textFont = new Font("宋体", Font.PLAIN, 14);
		panelObject = new JPanel();
		panelObject.setBackground(Color.pink);
		// panelObject.setForeground(Color.blue);
		cgbObject = new GridBagLayout();
		cgbc = new GridBagConstraints();
//getContentPane().add(panelObject);
		panelObject.setLayout(cgbObject);
		jtextarea = new JTextArea("欢迎进入本聊天室\n", 30, 120);

		jtextarea.setBackground(Color.lightGray);
		jtextarea.setForeground(Color.blue);// 设置前景颜色
		jtextarea.setBorder(BorderFactory.createEtchedBorder(Color.white,
				Color.black));
		// 设置文本区域的边框
		jtextarea.setWrapStyleWord(true);// 设置自动换行
		jtextarea.setEditable(false);// 设置文本区域不可编辑
		jtextarea.setFont(textFont);
		model = new DefaultListModel();// model类为显示在线用户列表的类,它放在JList类的构造符当中

		listCust = new JList(model);// 将model放在JList当中
		listCust.setBackground(Color.white);
		listCust.setForeground(Color.red);
		listCust.setBorder(BorderFactory.createEtchedBorder(Color.white,
				Color.black));
		listCust.addListSelectionListener(this);// 添加监听器,其接口是ListSelectionListener
		jscrollpane = new JScrollPane(jtextarea,
				ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
				ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		jscrollpane.getVerticalScrollBar().setValue(
				jscrollpane.getVerticalScrollBar().getMaximum());
		// 设置当文本区域需要换行时滚动条自动下拉(自动滚屏)
		jscrollpane1 = new JScrollPane(listCust,
				ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
				ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		// 设置文本区域框的横向滚动条为没有,纵向滚动条始终出现
		check1 = new JCheckBox("私聊");
		check1.setBackground(Color.pink);
		check1.setFont(cfont);
		textCust = new JTextField("所有人", 8);
		textCust.setEditable(false);
		check2 = new JCheckBox("分屏");
		check2.setFont(cfont);
		check2.setBackground(Color.pink);
		check2.addItemListener(this);
		check1.addItemListener(this);

		textMessage = new JTextField(50);

		box1 = new JComboBox();
		box1.addItem("语态>>");
		box1.addItem("温柔地");
		box1.addItem("羞嗒嗒地");
		box1.addItem("恳求地");
		box1.addItem("微笑地");
		box1.addItem("冤枉地");
		box1.addItem("生气地");
		box1.addItem("兴高采烈地");
		box1.setBackground(Color.white);
		box1.setFont(cfont);
		box2 = new JComboBox();
		box2.addItem("字色>>");
		box2.addItem("黄色");
		box2.addItem("大红");
		box2.addItem("绿色");
		box2.addItem("蓝色");
		box2.setBackground(Color.white);
		box2.setFont(cfont);
		box2.addActionListener(this);
		box3 = new JComboBox();
		box3.addItem("插图>>");
		box3.setBackground(Color.white);
		box3.setFont(cfont);
		box1.addItemListener(this);
		box2.addItemListener(this);
		box3.addItemListener(this);
		buttonSend = new JButton("发言");
		buttonSend.addActionListener(this);

		buttonSend.setBackground(Color.pink);
		buttonSend.setFont(cfont);

		// gbc.fill=GridBagConstraints.BOTH;
		cgbc.anchor = GridBagConstraints.EAST;
		cgbc.gridwidth = 5;
		cgbc.gridheight = 1;
		cgbObject.setConstraints(jscrollpane, cgbc);
		panelObject.add(jscrollpane);

		cgbc.anchor = GridBagConstraints.EAST;
		cgbc.fill = GridBagConstraints.BOTH;
		cgbc.gridwidth = GridBagConstraints.REMAINDER;
		// gbc.weighty=1.0;
		cgbc.gridheight = 2;
		cgbObject.setConstraints(jscrollpane1, cgbc);
		panelObject.add(jscrollpane1);

		/*
		 * gbc.anchor=GridBagConstraints.WEST;
		 * gbc.gridwidth=GridBagConstraints.REMAINDER;
		 * gbc.fill=GridBagConstraints.NONE; gbc.weightx=0.0; gbc.weighty=0.0;
		 * gbc.gridheight=1; //gbc.gridwidth=1;
		 * gbObject.setConstraints(label1,gbc); panelObject.add(label1);
		 */

		cgbc.anchor = GridBagConstraints.WEST;
		cgbc.gridheight = 1;
		cgbc.gridwidth = 1;
		cgbObject.setConstraints(textMessage, cgbc);
		panelObject.add(textCust);

		cgbc.anchor = GridBagConstraints.WEST;
		cgbc.gridheight = 1;
		cgbc.gridwidth = 1;
		cgbObject.setConstraints(check1, cgbc);
		panelObject.add(check1);

		cgbc.anchor = GridBagConstraints.WEST;
		cgbc.fill = GridBagConstraints.NONE;
		cgbc.gridheight = 1;
		cgbc.gridwidth = 1;
		cgbc.weighty = 0.0;
		cgbObject.setConstraints(box1, cgbc);
		panelObject.add(box1);

		cgbc.anchor = GridBagConstraints.WEST;
		cgbc.gridheight = 1;
		cgbc.gridwidth = 1;
		cgbc.weighty = 0.0;
		cgbObject.setConstraints(box2, cgbc);
		panelObject.add(box2);

		cgbc.anchor = GridBagConstraints.WEST;
		cgbc.gridheight = 1;
		cgbc.gridwidth = 1;
		cgbc.weighty = 0.0;
		cgbObject.setConstraints(box3, cgbc);
		panelObject.add(box3);

		cgbc.gridwidth = GridBagConstraints.REMAINDER;
		cgbc.anchor = GridBagConstraints.WEST;
		// gbc.gridwidth=1;
		cgbc.gridheight = 1;
		cgbObject.setConstraints(check2, cgbc);
		panelObject.add(check2);

		cgbc.anchor = GridBagConstraints.EAST;
		// gbc.fill=GridBagConstraints.BOTH;
		// gbc.weightx=1.0;
		cgbc.weighty = 0.0;
		cgbc.gridheight = 1;
		cgbc.gridwidth = 1;
		cgbObject.setConstraints(textMessage, cgbc);
		panelObject.add(textMessage);

		cgbc.anchor = GridBagConstraints.WEST;
		cgbc.fill = GridBagConstraints.NONE;
		cgbc.gridwidth = GridBagConstraints.REMAINDER;
		cgbc.gridheight = 1;
		cgbObject.setConstraints(buttonSend, cgbc);
		panelObject.add(buttonSend);
		
		getContentPane().add(mpanel);
		mpanel.add(panel);
		//panel.setSize(100, 200);
		panel.setLocation(200, 100);
		mpanel.add(panelObject);
		//panelObject.setSize(800, 600);
		panel.setLocation(200, 100);
		panelObject.setVisible(false);
		
//		this.setSize(500, 300);
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == box2)// 当用户选择JComboBox的下拉列表选择颜色时
		{
			String color = (String) box2.getSelectedItem();// 定义字符串以获得用户所选择的颜色
			if (color.equals("字色>>")) {
				box2.setBackground(Color.blue);
				jtextarea.setForeground(Color.blue);
			}
			if (color.equals("黄色")) {
				box2.setBackground(Color.yellow);
				jtextarea.setForeground(Color.yellow);
			}
			if (color.equals("大红")) {
				box2.setBackground(Color.red);
				jtextarea.setForeground(Color.red);
			}
			if (color.equals("绿色")) {
				box2.setBackground(Color.green);
				jtextarea.setForeground(Color.green);
			} else if (color.equals("蓝色")) {
				box2.setBackground(Color.blue);
				jtextarea.setForeground(Color.blue);
			}
		}
		if (e.getSource() == buttonSend)// 当用户点击发送按钮时
		{
			if (textMessage.getText().equals(""))// 如果发送的内容为空
			{
				JOptionPane.showMessageDialog(null, "发送消息不能为空", "警告",
						JOptionPane.ERROR_MESSAGE);
			}
			else if (textMessage.getText() != null) {

				if (flag % 2 == 1)// 如果是公聊
				{
					StringBuffer msg = new StringBuffer("MSG:"); // 定义并实例化一个字符缓冲存储发送的聊天信息
					String action = (String) box1.getSelectedItem();
					if (action.equals("语态>>")) {
						action = "";
					}
					String message = action + "对" + textCust.getText() + "说:";
					message = message + textMessage.getText();
					// 其中MSG为关键词
					ps.println(msg.append(message)); // 用打印流发送聊天信息
					ps.flush();
					textMessage.setText(null);
					// jscrollpane.getVerticalScrollBar().setValue(500);
					// jscrollpane.getVerticalScrollBar().setValue(jscrollpane.getVerticalScrollBar().getMaximum());
				}
				if (flag % 2 == 0)// 如果是私聊
				{
					StringBuffer privateMsg = new StringBuffer("PRIVATE:");
					String tm = (String) textCust.getText();
					String pm = str + ":" + tm + ":" + textMessage.getText();
					ps.println(privateMsg.append(pm));
					ps.flush();
				}
			}
		}
		
		if (e.getSource() == login)// 当用户点击登陆按钮时
		{

			if (custName.getText().equals(""))// 判断用户名和密码是否为空,如果为空就提出警告
			{
				JOptionPane.showMessageDialog(null, "用户名不能为空", "警告",
						JOptionPane.ERROR_MESSAGE);
			}

			else {
				//app app1 = new app(this);// 如果不为空就进入聊天室主界面
				
				try {
					soc = this.socket;

					ps = new PrintStream(soc.getOutputStream());
					str = (String) this.custName.getText();
					listen = new Listen(this, str, soc);
					panel.setVisible(false);
					panelObject.setVisible(true);
					//Listen(this, str, soc);
					// Listen类为线程类,在后面实现
				} catch (Exception e1) {
					e1.printStackTrace();
				}
				
				
				
				StringBuffer info = new StringBuffer("INFO: ");
				String userinfo = custName.getText().trim();// trim()方法为去掉字符串的空格
				toServer.println(info.append(userinfo));// 一旦登陆就把用户名发送到服务器端以显示在线用户列表
				toServer.flush();
			}

		}
		if (e.getSource() == register) 
		{
			
		}

	}
	
	public void itemStateChanged(ItemEvent e1)// 此方法是ItmeListener接口的方法
	{
		if (e1.getItemSelectable() == check1)// 当用户选择私聊复选框时
		{
			flag++;
		}
	}

	public void valueChanged(ListSelectionEvent e2)// 此方法是ListSelectionListener接口的方法
	{
		JList list = (JList) e2.getSource();
		ccustName = (String) list.getSelectedValue();// 获得用户点击的用户
		if (ccustName != null) {
			textCust.setText(ccustName);// 把它显示在说话对象的文本框内
		}
	}
}

  //下面是从数据库用户登录
//public void denglu() {
//	try {
//		Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//		Connection con = DriverManager.getConnection("jdbc:odbc:myDSN",
//				"sa", "niit");
//		Statement st=con.createStatement();
//		String sql="select username,ps from biao";
//		ResultSet rs=st.executeQuery(sql);
//		boolean flag=false;
//	    while(rs.next())
//	    {
//	    	String id=rs.getString("username");
//	    	String mima=rs.getString("ps");
//	    	if(id.equals(custName.getText())&&mima.equals(custPassword.getText()))
//	    	{
//	    		flag=true;
//	    	}
//	    }
//	    if(flag==true)
//	    {
//	    	JOptionPane.showMessageDialog(null, "登陆成功");
//	    }
//	    else
//	    	JOptionPane.showMessageDialog(null, "登陆失败");
//	} catch (ClassNotFoundException e) {
//		// TODO Auto-generated catch block
//		e.printStackTrace();
//	} catch (SQLException e) {
//		// TODO Auto-generated catch block
//		e.printStackTrace();
//	}
//}

⌨️ 快捷键说明

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