亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? chatclient.java

?? 編了一個簡單的聊天器
?? JAVA
字號:
//ChatClient.java
package chatclient;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.rmi.RemoteException;
import java.util.Hashtable;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JButton;
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.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.text.JTextComponent;
import javax.swing.text.Keymap;

import chat.ChatServer;
import chat.Chatter;

public class ChatClient extends JFrame {
	//存儲已有聊天用戶,key:用戶名.value: 對應的Chatter對象
	Hashtable hash = new Hashtable();
	
	//自己的用戶名
	String my_name = "chatter";
	//服務器地址
	String serverAddr;
	//代表客戶端到遠程對象
	Chatter chatter;
	//服務器端到遠程對象
	ChatServer server;

	JTextArea displayBox;
	JTextArea inputBox;
	JComboBox usersBox;
	JButton sendButton;
	JLabel statusLabel;

	ConnectionAction connectAction = new ConnectionAction();
	
	//讓用戶輸入用戶名和服務器地址到對話框
	ConnectDlg dlg = new ConnectDlg(this);
	
	public static void main(String[] args) {
		new ChatClient();
	}
	
	//客戶端界面類構(gòu)造函數(shù)
	public ChatClient() {
		super("聊天-客戶端");
		layoutComponent();
		setupMenu();
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				exit();
			}
		});
		show();
	}
	
	//設置菜單
	private void setupMenu() {
		JMenuBar menuBar = new JMenuBar();
		JMenuItem conn = new JMenuItem(connectAction);
		JMenuItem exit = new JMenuItem("退出");
		exit.addActionListener(new AbstractAction() {
			public void actionPerformed(ActionEvent evt) {
				exit();
			}
		});
		JMenu file = new JMenu("文件");
		file.add(conn);
		menuBar.add(file);
		setJMenuBar(menuBar);
	}
	
	//處理 退出 的函數(shù)
	private void exit() {
		destroy();
		System.exit(0);
	}
	
	//布置各個界面元素
	public void layoutComponent() {
		setSize(400, 400);
		JPanel contentPane = new JPanel();
		
		//使用GridBagLayout對各控件布局
		GridBagLayout gridbag = new GridBagLayout();
		GridBagConstraints c = new GridBagConstraints();
		contentPane.setLayout(gridbag);

		//最上端的顯示消息的文本域
		c.fill = GridBagConstraints.BOTH;
		c.gridwidth = GridBagConstraints.REMAINDER;
		c.gridheight = 6;
		c.weightx = 100;
		c.weighty = 100;
		c.insets.top = 5;
		displayBox = new JTextArea();
		displayBox.setLineWrap(true);
		displayBox.setEditable(false);
		displayBox.setMargin(new Insets(5, 5, 5, 5));
		JScrollPane scrollPane = new JScrollPane(displayBox);
		contentPane.add(scrollPane, c);

		//消息 標簽
		c.gridheight = 1;
		c.weightx = 0;
		c.weighty = 0;
		c.insets.top = 10;
		JLabel msgLabel = new JLabel("消息:");
		contentPane.add(msgLabel, c);

		//消息輸入文本框
		c.gridheight = 6;
		c.insets.top = 0;
		c.gridwidth = GridBagConstraints.RELATIVE;
		c.weightx = 100;
		inputBox = new JTextArea();
		addKeymapBindings();
		inputBox.setLineWrap(true);
		inputBox.setWrapStyleWord(true);
		JScrollPane inputScrollPane = new JScrollPane(inputBox);
		inputScrollPane.setPreferredSize(new Dimension(250, 50));
		inputScrollPane.setMinimumSize(new Dimension(250, 50));
		contentPane.add(inputScrollPane, c);

		//發(fā)送消息 按鈕
		c.weightx = 0;
		c.gridwidth = GridBagConstraints.REMAINDER;
		sendButton =
			new JButton(
				new ImageIcon(getClass().getResource("images/send.gif")));
		sendButton.setToolTipText("發(fā)送消息");
		sendButton.setPreferredSize(new Dimension(50, 50));
		sendButton.setMinimumSize(new Dimension(50, 50));
		sendButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				sendMessage();
			}
		});
		contentPane.add(sendButton, c);

		//發(fā)送給 標簽
		c.weightx = 0;
		c.fill = GridBagConstraints.HORIZONTAL;
		c.gridheight = 1;
		JLabel sendtoLabel = new JLabel("發(fā)送給:");
		contentPane.add(sendtoLabel, c);

		//用戶 下拉列表框
		usersBox = new JComboBox();
		usersBox.setBackground(Color.WHITE);
		usersBox.addItem("所有用戶");
		contentPane.add(usersBox, c);

		//狀態(tài)欄
		JPanel statusPane = new JPanel(new GridLayout(1, 1));
		statusLabel = new JLabel("未連接");
		statusPane.add(statusLabel);
		contentPane.add(statusPane, c);

		setContentPane(contentPane);

		//實例化ChatterImpl對象
		try {
			chatter = new ChatterImpl(this);
		} catch (Exception e) {
			e.printStackTrace();
			return;
		}
	}
	
	public void destroy() {
		try {
			disconnect();
		} catch (java.rmi.RemoteException ex) {
			ex.printStackTrace();
		}
	}

	//執(zhí)行連接操作
	protected void connect()
		throws
			java.rmi.RemoteException,
			java.net.MalformedURLException,
			java.rmi.NotBoundException {
		server =
			(ChatServer) java.rmi.Naming.lookup(
				"//" + serverAddr + "/ChatServer");
		server.login(my_name, chatter);
	
	}

	//退出聊天室
	protected void disconnect() throws java.rmi.RemoteException {
		if (server != null)
			server.logout(my_name);
	}

//**********************************************************************
//以下四個函數(shù)是實現(xiàn)Chatter接口
	public void receiveEnter(
		String name,
		Chatter chatter,
		boolean hasEntered) {
		if (name != null && chatter != null) {
			hash.put(name, chatter);
			if (!name.equals(my_name)) {
				//對新加入聊天到用戶,在displayBox給出提示
				if (!hasEntered)
					display(name + " 進入聊天室");
				usersBox.addItem(name);
			}
		}
	}

	public void receiveExit(String name) {
		if (name != null && chatter != null)
			hash.remove(name);
		for (int i = 0; i < usersBox.getItemCount(); i++) {
			if (name.equals((String) usersBox.getItemAt(i))) {
				usersBox.remove(i);
				break;
			}
		}
		display(name + " 離開聊天室");
	}

	public void receiveChat(String name, String message) {
		display(name + ": " + message);
	}

	public void receiveWhisper(String name, String message) {
		display(name + " (私聊): " + message);
	}
//*********************************************************************

	//在消息輸入框中 處理鍵盤消息,Ctrl+Enter換行,Enter則發(fā)送消息
	protected void addKeymapBindings() {
		Keymap keymap =
			JTextComponent.addKeymap("MyBindings", inputBox.getKeymap());

		Action action = null;
		KeyStroke key = null;

		//用戶在消息輸入框中按回車發(fā)送消息
		action = new AbstractAction() {
			public void actionPerformed(ActionEvent evt) {
				sendMessage();
			}
		};
		key = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
		keymap.addActionForKeyStroke(key, action);

		//Ctrl+Enter則實現(xiàn)換行
		action = new AbstractAction() {
			public void actionPerformed(ActionEvent evt) {
				inputBox.append("\n");
			}
		};
		key = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, Event.CTRL_MASK);
		keymap.addActionForKeyStroke(key, action);

		inputBox.setKeymap(keymap);
	}
	
	//在顯示消息的文本域中顯示消息
	private void display(String s) {
		if (!s.endsWith("\n")) {
			displayBox.append(s + "\n");
		} else {
			displayBox.append(s);
		}

		int length = displayBox.getText().length() - 1;
		displayBox.select(length, length);
	}
	
	//從消息框取得消息內(nèi)容,發(fā)送消息函數(shù)
	private void sendMessage() {
		String message = inputBox.getText();
		if (message != null && message.length() > 0) {
			inputBox.setText(null);
			inputBox.setCaretPosition(0);
			display(my_name + ":" + message);
			if (server != null) {
				if ("所有用戶".equals(usersBox.getSelectedItem())) {//發(fā)送給所有用戶
					try {
						server.chat(my_name, message);
					} catch (java.rmi.RemoteException ex) {
						ex.printStackTrace();
					}
				} else {//私聊,發(fā)給所選用戶
					String destUserName = (String) usersBox.getSelectedItem();
					Chatter destChatter = (Chatter) hash.get(destUserName);
					try {
						destChatter.receiveWhisper(my_name, message);
					} catch (RemoteException e) {
						e.printStackTrace();
					}
				}
			}
		}
		inputBox.requestFocus();
	}

	public void serverStop() {
		display("聊天服務器關閉");
		server = null;
		hash.clear();
		connectAction.setEnabled(true);
	}

	//處理連接命令的 Action類
	class ConnectionAction extends AbstractAction {
		public ConnectionAction() {
			super("連接");
			putValue(Action.SHORT_DESCRIPTION, "連接到聊天服務器");
			putValue(
				Action.ACCELERATOR_KEY,
				KeyStroke.getKeyStroke("control C"));
		}
		public void actionPerformed(ActionEvent evt) {
			dlg.pack();
			dlg.setLocationRelativeTo(ChatClient.this);
			dlg.setVisible(true);
			if (dlg.getValue() == JOptionPane.OK_OPTION) {
				try {
					my_name = dlg.getUserName();
					serverAddr = dlg.getServerAddr();
					connect();
					inputBox.setEditable(true);
					displayBox.setText("");
					statusLabel.setText(my_name + "  已連接");
					this.setEnabled(false);
				} catch (Exception e) {
					e.printStackTrace();
					statusLabel.setText("不能連接到聊天服務器");
					return;
				}
			}
		}
	} //End class ConnectionAction
} //END CLASS

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本韩国一区二区三区| 久久久99免费| 国内精品久久久久影院色| 午夜精品久久久久久久久| 亚洲综合色在线| 亚洲一区在线观看免费 | 亚洲精选一二三| 国产精品国产精品国产专区不蜜| 日本一区二区成人在线| 日本一区二区三区电影| 国产精品精品国产色婷婷| 日韩和欧美一区二区三区| 免费不卡在线视频| 国产米奇在线777精品观看| 国产在线播放一区| 91精品国产综合久久福利软件| 日韩一级黄色大片| 国产色产综合产在线视频| 亚洲成人在线观看视频| 国产麻豆精品95视频| 欧美一级高清片在线观看| 一级日本不卡的影视| 理论片日本一区| 99热精品国产| 欧美性xxxxx极品少妇| 久久久青草青青国产亚洲免观| 91久久线看在观草草青青| 欧美国产激情一区二区三区蜜月| 久久成人久久爱| 日韩欧美一区二区不卡| 国产午夜精品一区二区三区嫩草| 欧美a级理论片| 欧美一区二区在线不卡| 亚洲成va人在线观看| 欧美亚洲高清一区| 一区二区三区欧美视频| 成人精品国产免费网站| 欧美日韩国产电影| 国产欧美日韩激情| 国产精品中文字幕欧美| 欧美日韩亚洲综合一区二区三区 | 中文字幕一区二区三| 偷拍与自拍一区| 欧美精品丝袜中出| 久久亚洲综合色| 一区二区不卡在线视频 午夜欧美不卡在 | 99久久精品免费看国产免费软件| 欧美丝袜丝交足nylons图片| 亚洲黄色av一区| 色8久久精品久久久久久蜜| 亚洲在线中文字幕| 91麻豆精品国产自产在线观看一区| 精品福利二区三区| 一区二区三区中文字幕精品精品| 日韩激情在线观看| 国产欧美日韩卡一| 国产成人综合在线观看| 丁香另类激情小说| 高清在线成人网| 国产欧美一区二区精品忘忧草| caoporen国产精品视频| 亚洲三级在线免费| 亚洲一区免费观看| 色香蕉成人二区免费| 精品久久久久久最新网址| 欧美bbbbb| 久久综合五月天婷婷伊人| 午夜电影一区二区三区| 91蝌蚪porny九色| 久久这里只精品最新地址| 免费久久99精品国产| 国产日韩高清在线| 色综合色狠狠天天综合色| 亚洲精品欧美在线| 欧美美女视频在线观看| 欧美bbbbb| 中文字幕精品一区| 东方欧美亚洲色图在线| 国产精品久久777777| 在线视频一区二区三| 亚洲自拍与偷拍| 精品国产污网站| 成人精品gif动图一区| 亚洲一区二区三区在线播放| 日韩午夜在线观看视频| 久久不见久久见中文字幕免费| 中文字幕一区二区视频| 884aa四虎影成人精品一区| 久久99精品视频| 日韩精品一区二区三区四区| 日韩在线观看一区二区| 91丨九色丨国产丨porny| 亚洲国产日韩a在线播放| 一本色道**综合亚洲精品蜜桃冫| 亚洲欧美国产高清| ㊣最新国产の精品bt伙计久久| www.日韩av| 老司机精品视频一区二区三区| 最新热久久免费视频| 日韩一区二区三区观看| 成人激情文学综合网| 日韩不卡一区二区| 亚洲男人都懂的| 国产视频在线观看一区二区三区| 91同城在线观看| 国产精品69久久久久水密桃| 偷拍自拍另类欧美| 亚洲人成亚洲人成在线观看图片| 日韩欧美一二三四区| 欧美综合色免费| 懂色av一区二区三区免费观看| 日本vs亚洲vs韩国一区三区| 亚洲乱码精品一二三四区日韩在线| 精品免费日韩av| 色天使色偷偷av一区二区| 91极品视觉盛宴| 91美女精品福利| 成人激情av网| 国产美女精品在线| 极品少妇xxxx精品少妇偷拍 | 一本大道av伊人久久综合| 国产毛片精品视频| 久久69国产一区二区蜜臀| 亚洲综合无码一区二区| 亚洲在线视频一区| 亚洲精品ww久久久久久p站| 一区在线播放视频| 国产精品电影院| 国产精品免费aⅴ片在线观看| 国产日韩欧美麻豆| 久久精品亚洲乱码伦伦中文| 久久免费美女视频| 日韩欧美电影在线| 中文一区二区完整视频在线观看| 久久久精品蜜桃| 久久久久久久综合狠狠综合| 精品成人一区二区三区四区| 日韩免费一区二区| 欧美精品一区二区三区蜜桃视频| 日韩欧美国产精品一区| 日韩精品中文字幕一区| 欧美男生操女生| 91 com成人网| 26uuu色噜噜精品一区二区| 欧美变态tickle挠乳网站| 久久新电视剧免费观看| 久久青草国产手机看片福利盒子 | 91成人网在线| 欧美色倩网站大全免费| 欧美在线短视频| 91免费国产在线观看| 欧美一区二区三区免费在线看| 精品久久国产字幕高潮| 久久久五月婷婷| 国产精品初高中害羞小美女文| 亚洲人成网站色在线观看| 亚洲成人黄色影院| 寂寞少妇一区二区三区| 成人av电影在线观看| www.66久久| 欧美午夜精品久久久| 日韩一级大片在线观看| 久久精品视频在线看| 一区二区三区四区视频精品免费| 香蕉成人伊视频在线观看| 久久av老司机精品网站导航| 成人app在线| 久久国产生活片100| 欧美日韩黄色影视| 免费精品视频在线| 在线视频欧美区| 日日夜夜免费精品视频| 91美女视频网站| 亚洲视频免费在线| 大白屁股一区二区视频| 日韩免费观看2025年上映的电影| 国产又黄又大久久| 精品国产免费人成在线观看| 91麻豆视频网站| 成人深夜视频在线观看| 在线观看精品一区| 欧美精品一区在线观看| 亚洲欧美激情一区二区| 精品一区二区在线观看| 在线欧美日韩国产| 日本一区二区三区在线不卡| 婷婷亚洲久悠悠色悠在线播放| 成人听书哪个软件好| 色综合咪咪久久| 久久午夜免费电影| 偷拍一区二区三区| av电影在线观看完整版一区二区| 欧美草草影院在线视频| 亚洲成av人片在线观看无码| 成人永久aaa| 2020国产成人综合网| 视频在线观看一区| 色先锋资源久久综合| 国产精品久久一级| 国产麻豆成人精品|