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

📄 clientframe.java

📁 JAVA编写的聊天小程序!!程序默认需放到D:下
💻 JAVA
字号:
package group.client;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;
import javax.swing.border.*;
import group.MesPanel;

/**
 客户端聊天的主界面类
 @author wls
*/
public class ClientFrame extends JFrame
{
	private String[] mesStr;					//用于容纳消息的数组
	private JTextField mesIn;					//用户输入消息的文本框
	private JButton send;						//发送消息的按钮
	private JButton latent;						//发送悄悄话的按钮
	private MesPanel mesPane;					//显示消息的面板
	private FrendListPanel frendList;				//显示好友列表的面板
	private JPanel sendMesPane;					//用于输入消息和发送消息的面板
	private Client client;						//客户端主类对象的一个引用

	/**
	 构造函数,主要初始化一些属性
	 @param c 客户端主类的对象的一个引用
	*/
	public ClientFrame(Client c)
	{
		super("欢迎来到聊天室");				//设置窗口标题
		setSize(700, 550);					//设置窗口大小

		Toolkit kit = Toolkit.getDefaultToolkit();	//下面这一小段用来计算窗口应放置的信置
		Dimension screenSize = kit.getScreenSize();
		int screenWidth = screenSize.width;
		int screenHeight = screenSize.height;
		int localX = (screenWidth - getSize().width) / 2;
		int localY = (screenHeight - getSize().height) / 2;
		setLocation(localX, localY);
		setResizable(false);					//把窗口设为不可编辑,主要是为了界面

		mesStr = new String[80];				//初始化容纳消息的数组并赋初值

		try
		{
			BufferedReader buf = new BufferedReader(new FileReader("readme.txt"));
			String tmp;
			int n = 0;

			while((tmp = buf.readLine()) != null)
			{
				mesStr[n] = tmp;
				n++;
			}

			int length = mesStr.length;
			mesStr[length - 1] = "";

			for(int i = length - 1; --i >= 15;)
			{
				if(--n >= 0)
				{
					mesStr[i] = mesStr[n];
				}
				else
				{
					mesStr[i] = "";
				}
			}

			mesStr[14] = "";
			mesStr[13] = "此处是消息显示窗口,请把滚动条往下拉!";

			for(int i = 13; --i >= 0;)
			{
				mesStr[i] = "";
			}

			buf.close();
		}catch(Exception e)
		{
			System.out.println("初始化消息数组初错,数组全部初始化为空");
			System.out.println(e.toString());
			for(int i = mesStr.length; --i >=0;)
			{
				mesStr[i] = "";
			}
		}

		Action sendAction = new SendAction("发   送");
		LatentAction latentAction = new LatentAction("悄悄话");


		mesIn = new JTextField("在此输入您的消息!", 45);//把消息输入框的长度设为45个字符并设置字体
		mesIn.setFont(new Font("SansSerif", Font.PLAIN, 14));
		mesIn.addFocusListener(new FocusAdapter()
			{
				public void focusGained(FocusEvent e)
				{
					mesIn.setText("");
				}
			});

		Font f = new Font("Serif", Font.BOLD, 14);
		send = new JButton(sendAction);
		send.setFont(f);
		latent = new JButton(latentAction);
		latent.setFont(f);

		mesPane = new MesPanel("聊天消息", 22, 45);	//初始化消息面板和好友列表面板
		mesPane.setTextFont(new Font("Serif", Font.PLAIN, 14));
		frendList = new FrendListPanel("在线好友", 22, 150);

		sendMesPane = createPane();
		InputMap imap = sendMesPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
		imap.put(KeyStroke.getKeyStroke("ENTER"), "send");
		imap.put(KeyStroke.getKeyStroke("ctrl ENTER"), "latent");
		ActionMap amap = sendMesPane.getActionMap();
		amap.put("send", sendAction);
		amap.put("latent", latentAction);
		Border border = BorderFactory.createEtchedBorder(EtchedBorder.RAISED,
			Color.black, Color.white);			//创建一个用于面板的3D直线边界
		sendMesPane.setBorder(border);

		Container pane = getContentPane();			//把三个面板添加到窗口中
		pane.add(mesPane, BorderLayout.CENTER);
		pane.add(frendList, BorderLayout.EAST);
		pane.add(sendMesPane, BorderLayout.SOUTH);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		client = c;							//设置在处理事件时要用到的Client类的对象
	}

	/*
	 创建用于输入消息的面板,此面板采用GridBagLayout布局
	*/
	private JPanel createPane()
	{
		JPanel pane = new JPanel();
		GridBagLayout gbl = new GridBagLayout();
		GridBagConstraints gbc = new GridBagConstraints();
		pane.setLayout(gbl);

		JPanel tmpPane = new JPanel();
		tmpPane.setSize(680,15);
		help(gbc, 0, 0, 3, 1, 0, 100);
		gbl.setConstraints(tmpPane,gbc);
		pane.add(tmpPane);

		gbc.fill = GridBagConstraints.VERTICAL;
		help(gbc, 0, 1, 1, 1, 30, 100);
		gbl.setConstraints(mesIn, gbc);
		pane.add(mesIn);

		gbc.fill = GridBagConstraints.NONE;
		help(gbc, 1, 1, 1, 1, 35, 100);
		gbl.setConstraints(send, gbc);
		pane.add(send);

		help(gbc, 2, 1, 1, 1, 35, 100);
		gbl.setConstraints(latent, gbc);
		pane.add(latent, gbc);

		return pane;
	}

	/*
	 辅助设置组件约束的方法
	*/
	private void help(GridBagConstraints gbc, int gridx, int gridy, int gridwidth, int gridheight,
		int weightx, int weighty)
	{
		gbc.gridx = gridx;
		gbc.gridy = gridy;
		gbc.gridwidth = gridwidth;
		gbc.gridheight = gridheight;
		gbc.weightx = weightx;
		gbc.weighty = weighty;
	}

	/**
	 用于更新消息面板里面的消息的方法
	*/
	public void updateMes(String mes)
	{
		int i = 0;
		for( ; i < 79; i++)
		{
			mesStr[i] = mesStr[i + 1];
		}
		mesStr[i] = mes;
		mesPane.updateMes(mesStr);
	}

	/**
	 用于更新好友列表的方法
	*/
	public void updateFrend(String frendID)
	{
		frendList.updateFrend(frendID);
	}

	/*
	 处理发送消息按钮的事件的动作,用内部类实现,可以通过 Enter 来发送消息给所有人
	*/
	private class SendAction extends AbstractAction
	{
		public SendAction(String name)
		{
			putValue(Action.NAME, name);
			putValue(Action.SHORT_DESCRIPTION, "发送消息");
		}

		public void actionPerformed(ActionEvent e)
		{
			String tmpMes = mesIn.getText();

			if((tmpMes.length() > 100) || tmpMes.equals(""))
			{
				JOptionPane.showMessageDialog(ClientFrame.this,
					"您输入的消息太长或没输入消息,请输入100字以内的消息!",
					"错误", JOptionPane.WARNING_MESSAGE);
			}
			else
			{
				client.sendMes(tmpMes);
				mesIn.setText("");
			}
		}
	}

	/*
	 处理发送悄悄话的按钮的事件的类,可以通过按Ctrl + Enter来发送悄悄话
	*/
	private class LatentAction extends AbstractAction
	{
		public LatentAction(String name)
		{
			putValue(Action.NAME, name);
			putValue(Action.SHORT_DESCRIPTION, "发送悄悄话");
		}

		public void actionPerformed(ActionEvent e)
		{
			String toFrendID = frendList.getID();
			String tmpMes = mesIn.getText();

			if((tmpMes.length() > 100) || tmpMes.equals(""))
			{
				JOptionPane.showMessageDialog(ClientFrame.this,
					"您输入的消息太长或没输入消息,请输入100字以内的消息!",
					"错误", JOptionPane.WARNING_MESSAGE);
			}
			else if(toFrendID.equals(""))
			{
				JOptionPane.showMessageDialog(null, "您发送的是悄悄话,但是您没有选择要发送给谁!!!",
					"请选择好友", JOptionPane.ERROR_MESSAGE);
			}
			else
			{
				client.sendLatent(toFrendID, mesIn.getText());
				mesIn.setText("");
			}
		}
	}
}





⌨️ 快捷键说明

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