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

📄 clientframe.java

📁 本程序采用Java技术实现
💻 JAVA
字号:
package com.chat.client;

import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.*;
import java.util.List;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;
import javax.swing.text.StyledDocument;

import main.ClientMainClass;

import com.chat.constants.ClientConstants;
import com.chat.dto.MsgDTO1;
import com.chat.io.TxtManager;
import com.chat.util.FontDialog;
@SuppressWarnings("serial") 
public class ClientFrame extends JFrame implements Runnable {
	
	private JComboBox cbxUserId;
	private DefaultComboBoxModel cbxModel =new DefaultComboBoxModel();
	private Socket socket;


	private ObjectInputStream ois;

	private ObjectOutputStream oos;

	private boolean isConnected = false;

	private JTextPane txtDownMsg;

	private JTextPane txtUpMsg;
	
	private MsgDTO1 tempMsgDTO=new MsgDTO1();

	private StyledDocument doc;
	
	private String ip="127.0.0.1";
	private int port=8888;
	public static void main(String args[]) {
		try {
			ClientFrame frame = new ClientFrame(args[0],args[1],args[2]);
			frame.setVisible(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Create the frame
	 */
	public ClientFrame() {
		super();
	}

	public ClientFrame(String userId,String ip,String port) {
		super();
		this.tempMsgDTO.setUserId(userId);
		this.ip=ip;
		this.port=Integer.parseInt(port);
		getContentPane().setLayout(null);
		setTitle("Java聊天室-客户端     "+"用户: "+this.tempMsgDTO.getUserId()+" 当前在线");
		setBounds(100, 100, 553, 472);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		final JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		final JMenu menu_4 = new JMenu();
		menu_4.setText("制作说明(H)");
		menuBar.add(menu_4);

		final JMenuItem btnAbout = new JMenuItem();
		btnAbout.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				About.main(new String[0]);
			}
		});
		btnAbout.setText("关于......");
		menu_4.add(btnAbout);

		final JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(10, 43, 442, 191);
		getContentPane().add(scrollPane);

		txtUpMsg = new JTextPane();
		txtUpMsg.setEditable(false);
		scrollPane.setViewportView(txtUpMsg);

		final JScrollPane scrollPane_1 = new JScrollPane();
		scrollPane_1.setBounds(10, 273, 442, 98);
		getContentPane().add(scrollPane_1);

		txtDownMsg = new JTextPane();
		scrollPane_1.setViewportView(txtDownMsg);

		final JButton btnFont = new JButton();
		btnFont.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				getSelectedFont();
			}
		});
		btnFont.setText("字体");
		btnFont.setBounds(209, 244, 73, 23);
		getContentPane().add(btnFont);

		final JButton btnColor = new JButton();
		btnColor.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				getSelectedColor();
			}
		});
		btnColor.setText("颜色");
		btnColor.setBounds(298, 244, 81, 23);
		getContentPane().add(btnColor);

		final JButton btnClose = new JButton();
		btnClose.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				send(new String(ClientConstants.LOGOUT+ClientConstants.LOGIN_SPLIT+tempMsgDTO.getUserId()));
				dispose();
				System.exit(0);
			}
		});
		btnClose.setText("关闭(C)");
		btnClose.setBounds(281, 382, 81, 23);
		getContentPane().add(btnClose);

		final JButton btnSend = new JButton();
		btnSend.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				String content = txtDownMsg.getText();
				if (content.trim().equals(""))//空消息
					return;
				if(cbxModel.getSelectedItem().toString().equals(tempMsgDTO.getUserId())){
					javax.swing.JOptionPane.showMessageDialog(null, "对不起,您不能与自己交谈!");
					return;
				}
				tempMsgDTO.setToWhere(cbxModel.getSelectedItem().toString());
				tempMsgDTO.setContent(content);
				//点击发送时把数据名发送到服务器
				if(send(transferMsgDTO())){
					txtDownMsg.setText("");
				}
			}
		});
		btnSend.setText("发送(S)");
		btnSend.setBounds(368, 382, 84, 23);
		getContentPane().add(btnSend);

		final JLabel label = new JLabel();
		label.setText("发给:");
		label.setBounds(10, 240, 30, 27);
		getContentPane().add(label);

		cbxUserId = new JComboBox();
		cbxUserId.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent e) {
				if   (e.getStateChange()   ==   ItemEvent.SELECTED)   {   //这里控制为只处理一次   
					tempMsgDTO.setToWhere(cbxModel.getSelectedItem().toString());
		          }   
			}
		});
		cbxUserId.setBounds(46, 244, 142, 23);
		getContentPane().add(cbxUserId);

		// my methods
		this.connect();
		new Thread(this).start();
	}

	private void connect() {
		try {
			socket = new Socket(this.ip, this.port);
			oos = new ObjectOutputStream(socket.getOutputStream());
			ois = new ObjectInputStream(socket.getInputStream());
			isConnected = true;
			// ////////////////////////////////////////////////////////////////////
			System.out.println("连接主机!-----success");
			send(ClientConstants.LOGIN_REQUEST+ClientConstants.LOGIN_SPLIT+this.tempMsgDTO.getUserId());
		} catch (IOException e) {
			e.printStackTrace();
			javax.swing.JOptionPane.showMessageDialog(null, "登陆失败,服务器不存在或端口错误!");
			System.exit(0);
		}
	}
	private boolean send(Object obj){
		try {
			this.oos.writeObject(obj);
			this.oos.flush();
			return true;
		} catch (IOException e) {
			javax.swing.JOptionPane.showMessageDialog(null, "信息发送失败,服务器可能已经关闭!");
			e.printStackTrace();
			return false;
		}
	}
	private boolean cbxContains(String item){
		int count=this.cbxModel.getSize();
		for(int i=0;i<count;i++){
			if(this.cbxModel.getElementAt(i).equals(item)){
				return true;
			}
		}
		return false;
	}
	@SuppressWarnings("unchecked")
	public void run() {
		try {
			while (isConnected) {
				Object tempObj = ois.readObject();
				//如果收到的是一个字符串
				if(tempObj instanceof String){
					if(tempObj.equals(ClientConstants.LOGIN_REPEAT)){
						dispose();
						javax.swing.JOptionPane.showMessageDialog(null, "登陆失败,该用户已经在其它地方登陆!");
						ClientMainClass.main(new String[0]);
					}
					if(tempObj.equals(ClientConstants.LOGIN_SUCCESS)){
						TxtManager.saveUserId(this.tempMsgDTO.getUserId());
					}
				}
				//如果接收到的是一个集合
				if(tempObj instanceof java.util.List){
					String selectedItem=null;
					if(this.cbxModel.getSize()>0){
						selectedItem=this.cbxModel.getSelectedItem().toString();
					}
					this.cbxModel.removeAllElements();
					List<String> list=(List<String>)tempObj;
					list.add(0,ClientConstants.FIRST_ITEM);
					for(String userId:list){
						cbxModel.addElement(userId);
					}
					cbxUserId.setModel(cbxModel);
					//判断刷新前的选项在当前cbx列表中是否存在
					if(selectedItem!=null && cbxContains(selectedItem)){
						cbxUserId.setSelectedIndex(cbxModel.getIndexOf(selectedItem));
					}
				}
				//如果接收到的是数据包
				if (tempObj instanceof MsgDTO1) {
					MsgDTO1 tempMsgDTO = (MsgDTO1) tempObj;
					setMessageText(tempMsgDTO);
				}
			}
		} catch (Exception e) {
			System.out.println("出错:ClientFrame.run");
			e.printStackTrace();
		}
	}

	private void getSelectedFont() {
		FontDialog dialog = new FontDialog(this, "请选择一种字体", this.tempMsgDTO
				.getFont(), true);
		dialog.showDialog();
		Font tempFont = null;
		if (FontDialog.DialogResult.Ok == dialog.getDialogResult()) {
			tempFont = dialog.getSelectedFont();
		}
		dialog.Dispose(); 
		if (tempFont != null) {
			this.tempMsgDTO.setFont(tempFont);
		}
	}

	private void getSelectedColor() {
		Color color = JColorChooser.showDialog(this, "请选择一种颜色", this.tempMsgDTO
				.getColor());
		if (color != null) {
			this.tempMsgDTO.setColor(color);
		}
	}
	private MsgDTO1 transferMsgDTO(){
		MsgDTO1 msgDTO=new MsgDTO1();
		msgDTO.setUserId(this.tempMsgDTO.getUserId());
		msgDTO.setContent(this.tempMsgDTO.getContent());
		msgDTO.setToWhere(this.tempMsgDTO.getToWhere());
		msgDTO.setFont(this.tempMsgDTO.getFont());
		msgDTO.setColor(this.tempMsgDTO.getColor());
		return msgDTO;
	}
	private void setMessageText(MsgDTO1 tempMsgDTO) {
		String msg=tempMsgDTO.getUserId()
		+ " 对 "
		+ tempMsgDTO.getToWhere() + " 说: "
		+ tempMsgDTO.getContent() + '\n';
		try {
			addStylesToDocument(tempMsgDTO);
			doc.insertString(doc.getLength(),msg, doc.getStyle("style1"));
		} catch (BadLocationException e) {
			e.printStackTrace();
		}
		// 让文本框的焦点始终在最下面
		txtUpMsg.setCaretPosition(doc.getLength());
	}// 初始化10种颜色的字体
	private void addStylesToDocument(MsgDTO1 tempMsgDTO) {
		doc = txtUpMsg.getStyledDocument();
		StyledDocument doc = txtUpMsg.getStyledDocument();
		// 试试简单方法
		Style def = StyleContext.getDefaultStyleContext().getStyle(
				StyleContext.DEFAULT_STYLE);
		Font tempFont=tempMsgDTO.getFont();
		Style tempStyle=doc.addStyle("style1", def);
		StyleConstants.setBold(tempStyle,tempFont.isBold());
		StyleConstants.setFontSize(tempStyle, tempFont.getSize());
		StyleConstants.setItalic(tempStyle,tempFont.isItalic());
		StyleConstants.setForeground(tempStyle,tempMsgDTO.getColor());
	}
}

⌨️ 快捷键说明

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