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

📄 mainwin.java

📁 一个使用Java实现的类似与QQ的聊天程序。使用了Hibernate组建。可用于学习Java网络编程和Hiberante数据库组件的学习
💻 JAVA
字号:
package com.jim.client;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;

import org.apache.log4j.Logger;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;

import com.jim.database.JIMUser;
import com.jim.net.JIMProtocol;
import com.jim.net.Message;
import com.jim.net.RequestObject;
import com.swtdesigner.SWTResourceManager;

public class MainWin {

	private List friendsList;
	private Menu rightMenu;
	private static Display display ;
	private static HashMap<Integer,Shell> winList = new HashMap<Integer,Shell> ();
	protected static Client client = new Client();
	protected static Queue<Message> messages = new LinkedList<Message>();
	protected static boolean loggedIn;
	private Thread msgTh;
	private Logger log = Logger.getLogger(MainWin.class);
	private volatile  Thread blinker;
	private Object lock = new Object();
	private Shell winShell;
	//protected static MainWin mainWin;
	//private static HashMap<Integer,Integer> fdList = new HashMap<Integer,Integer>();
	//private Menu menu;
	/**
	 * Launch the application
	 * @param args
	 */
	public static void main(String args[]) {/*
		try {
			Display display = Display.getDefault();
			Login loginWin = new Login(display, SWT.CLOSE | SWT.MIN);
			loginWin.open();
			loginWin.layout();			
			while (!loginWin.isDisposed()) {
				if (!display.readAndDispatch())
					display.sleep();
			}
			if(!loggedIn)
				return;
			MainWin shell = new MainWin(display, SWT.SHELL_TRIM);
			shell.open();
			shell.layout();
			//shell.setVisible(false);
			while (!shell.isDisposed()) {
				if (!display.readAndDispatch())
					display.sleep();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}		
	*/}

	/**
	 * Create the shell
	 * @param display
	 * @param style
	 */
	public MainWin() {
		this.display = Display.getCurrent();			
		createContents();
	}

	/**
	 * Create contents of the window
	 */
	protected void createContents() {
		winShell = new Shell(display, SWT.CLOSE | SWT.MIN | SWT.RESIZE);
		winShell.setText("JIM - "+client.getUser().getJimno());
		winShell.setSize(256, 535);
		winShell.setImage(SWTResourceManager.getImage(MainWin.class, "resources/1.bmp"));
		winShell.setLayout(new FillLayout());

		final Composite composite = new Composite(winShell, SWT.NONE);
		composite.setLayout(new FormLayout());

		final Group group = new Group(composite, SWT.BORDER);
		final FormData formData = new FormData();
		formData.right = new FormAttachment(100, -5);
		formData.bottom = new FormAttachment(100, -5);
		formData.left = new FormAttachment(0, 5);
		formData.top = new FormAttachment(0, 0);
		group.setLayoutData(formData);
		group.setLayout(new FillLayout());
		group.setText("好友列表");

		friendsList = new List(group, SWT.V_SCROLL | SWT.H_SCROLL);
		friendsList.setLocation(0, 0);
		friendsList.addMouseListener(new MouseAdapter() {
			public void mouseUp(MouseEvent event) {
				showOp(event);
			}
			public void mouseDoubleClick(MouseEvent event) {
				chat(event);
			}
		});
		Iterator<JIMUser> i = Client.getUser().getFriends().values().iterator();
		while(i.hasNext()){
			friendsList.add(i.next().toString());
		}
		
		friendsList.setSize(212, 452);
		final Menu menu = new Menu(winShell, SWT.BAR);
		winShell.setMenuBar(menu);
		winShell.addDisposeListener(new DisposeListener() {
			public void widgetDisposed(DisposeEvent de) {
				winDispose(de);
			}
		});

		final MenuItem menuItem = new MenuItem(menu, SWT.CASCADE);
		menuItem.setText("菜单");

		final Menu menu_1 = new Menu(menuItem);
		menuItem.setMenu(menu_1);
/*
		final MenuItem menuItem_4 = new MenuItem(menu_1, SWT.NONE);
		menuItem_4.setText("接收消息");
		menuItem_4.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent arg0) {
				createMsgTh();
				menuItem_4.setEnabled(false);
				log.debug("**************new thread started **********");
			}
		});
*/
		final MenuItem menuItem_1 = new MenuItem(menu_1, SWT.NONE);
		menuItem_1.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent arg0) {
				findUsers();
			}
		});
		menuItem_1.setText("查找好友");

		/*final MenuItem menuItem_2 = new MenuItem(menu_1, SWT.NONE);
		menuItem_2.setText("添加好友");*/

		final MenuItem menuItem_5 = new MenuItem(menu_1, SWT.NONE);
		menuItem_5.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent arg0) {
				updateMyInfo();
			}
		});
		menuItem_5.setText("更新个人信息");

		final MenuItem menuItem_6 = new MenuItem(menu_1, SWT.NONE);
		menuItem_6.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent arg0) {
				updateFriends();
			}
		});
		menuItem_6.setText("更新好友列表");

		final MenuItem menuItem_7 = new MenuItem(menu_1, SWT.NONE);
		menuItem_7.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent arg0) {
				register();
			}
		});
		menuItem_7.setText("注册新用户");

		new MenuItem(menu_1, SWT.SEPARATOR);

		final MenuItem menuItem_3 = new MenuItem(menu_1, SWT.NONE);
		menuItem_3.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent arg0) {
				winDispose(null);
			}
		});
		menuItem_3.setText("注销");
		
		rightMenu = new Menu(winShell);
		MenuItem item1= new MenuItem(rightMenu,SWT.NONE);
		item1.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent se) {
				viewInfor(se);
			}
		});
		item1.setText("查看好友信息");
		MenuItem item2= new MenuItem(rightMenu,SWT.NONE);
		item2.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent arg0) {
				deleteFriend();
			}
		});
		item2.setText("删除好友");

		//
	}

	protected void deleteFriend() {
		int selected = friendsList.getSelectionIndex();
		if(selected < 0)
			return;
		Integer uid = retrieveNo(friendsList.getItem(selected));
		
		client.deleteFriend(uid);
		client.getUser().deleteFriend(uid);
		friendsList.remove(selected);
		MessageBox mb = new MessageBox(winShell,SWT.ICON_INFORMATION | SWT.OK);
		mb.setMessage("删除好友成功");
		mb.open();
	}

	protected void findUsers() {
		ArrayList<JIMUser> added = null;
		FindUsersDialog fud = new FindUsersDialog(winShell);
		added = fud.open();
		if(added.size() == 0)
			return;
		JIMUser self = client.getUser();
		for(JIMUser u : added ){
			self.addFriend(u);
			friendsList.add(u.toString());
		}
		friendsList.redraw();
	}

	protected void updateFriends() {
		if(client.getUser().getFriendshipsForMasterno().size() == 0){
			MessageBox mb = new MessageBox(winShell,SWT.ICON_INFORMATION | SWT.OK);
			mb.setMessage("好友列表为空");
			mb.open();
		}else{
			RequestObject ret = client.updateFriends();
			String status = (String)ret.getParameter("status");
			JIMUser u =(JIMUser) ret.getParameter("user");
			if(status.equals("OK")){
				client.setUser(u);
				friendsList.removeAll();
				for(JIMUser user : u.getFriends().values()){
					friendsList.add(user.toString());
				}
				friendsList.redraw();
				MessageBox mb = new MessageBox(winShell,SWT.ICON_INFORMATION | SWT.OK);
				mb.setMessage("好友列表更新成功");
				mb.open();	
				return;
			}
			MessageBox mb = new MessageBox(winShell,SWT.ICON_INFORMATION | SWT.OK);
			mb.setMessage(status);
			mb.open();
		}
		
	}

	protected void updateMyInfo() {
		InforCardDialog  icd = new InforCardDialog(winShell,InforCardDialog.UPDATE,true);
		JIMUser u = client.getUser();
		icd.numText.setText(""+u.getJimno());	
		icd.pwdText.setText(""+u.getPwd());
		icd.nickText.setText(""+u.getNicknm());
		icd.ageText.setText(""+u.getAge());
		icd.nameText.setText(""+u.getName());
		icd.cityText.setText(""+u.getCity());
		icd.faceCombo.setText(icd.faceCombo.getItem(u.getPicindex()));
		if(u.getGender().equals(JIMUser.MALE)){
			icd.maleButton.setSelection(true);
		}else{
			icd.femaleButton.setSelection(true);
		}
		icd.emailText.setText(""+u.getEmail());
		icd.inforText.setText(""+u.getInfor());
		icd.open();
				
	}

	protected void register() {
		InforCardDialog  icd = new InforCardDialog(winShell,InforCardDialog.REGISTER,true);
		icd.open();
	}

	public void open(){
		winShell.open();
		winShell.layout();
		client.setMaiWin(this);
		/*display.asyncExec(new Thread(){
			public void run(){
				Message msg = null;
				Thread thisThread = Thread.currentThread();
				blinker = thisThread;
				while (blinker == thisThread) {
					if (messages.isEmpty()) {
						synchronized (lock) {
							try {
								lock.wait();
							} catch (InterruptedException e) {
								e.printStackTrace();
							}
						}
					}
					synchronized (messages) {
						msg = messages.poll();
					}
					showMsg(msg);
				}			
			}
		});*/
		while (!winShell.isDisposed()) {
			if(!display.readAndDispatch()){
				display.sleep();
			}
		}
	}
	protected void viewInfor(SelectionEvent se) {
//		InforCard ic = null;
		InforCardDialog ic = null;
		int selected = friendsList.getSelectionIndex();
		if( selected < 0)
			return;
		selected = retrieveNo(friendsList.getItem(selected));
		/*if((ic = (InforCardDialog)getWin(-selected)) != null){
			ic.setActive();
			return;
		}*/
		ic = new InforCardDialog(winShell,InforCardDialog.UPDATE,false);
		ic.setKey(-selected);
		//putWin(ic.getKey(), ic);
		JIMUser u = client.getUser().getFriends().get(selected);
		ic.numText.setText(""+u.getJimno());	
		ic.pwdText.setText(""+u.getPwd());
		ic.nickText.setText(""+u.getNicknm());
		ic.ageText.setText(""+u.getAge());
		ic.nameText.setText(""+u.getName());
		ic.cityText.setText(""+u.getCity());
		ic.faceCombo.setText(ic.faceCombo.getItem(u.getPicindex()));
		if(u.getGender().equals(JIMUser.MALE)){
			ic.maleButton.setSelection(true);
		}else{
			ic.femaleButton.setSelection(true);
		}
		ic.emailText.setText(""+u.getEmail());
		ic.inforText.setText(""+u.getInfor());
		ic.open();
		
		/*while (!ic.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}*/
	}

	protected void winDispose(DisposeEvent de) {
		blinker = null;
		//msgTh.notify();
		Iterator<Shell> i = winList.values().iterator();
		while(i.hasNext()){
			Shell sh = i.next();
			if(sh != null && !sh.isDisposed())
				sh.close();
		}
		client.logout();
		winShell.close();
	}

	protected void chat(MouseEvent event) {
		ChatWin win = null;
		int selected = retrieveNo(friendsList.getItem(friendsList.getSelectionIndex()));
		if((win =(ChatWin) getWin(selected)) != null){
			win.setActive();
			return;
		}
		//log.debug(selected);
		if(selected >= 0){
			JIMUser u = client.getUser().getFriends().get(selected);
			win = new ChatWin(display,SWT.SHELL_TRIM);
			win.setKey(selected);
			win.setMyJimno(client.getUser().getJimno());
			putWin(win.getKey(),win);
			String title="";
			if(u.getNicknm()==null ||u.getNicknm().equals(""))
				title += u.getJimno();
			else
				title += u.getNicknm();
			win.setText(win.getText()+" - "+title);
			win.open();
			win.layout();
			/*while (!win.isDisposed()) {
				if (!display.readAndDispatch())
					display.sleep();
			}*/
		}
		
	}

	protected void showOp(MouseEvent event) {
		if (event.button == 3 && (friendsList.getSelectionIndex()>= 0)) {
			rightMenu.setVisible(true);
		}		
	}

	
	protected static void removeWin(int key){
		winList.remove(key);
	}
	protected static Shell getWin(int key){
		return winList.get(key);
	}
	public static Integer retrieveNo(String s){
		int sIx = s.indexOf('[');
		int eIx = s.indexOf(']');
		return Integer.parseInt(s.substring(sIx+1, eIx));
	}

	public static void putWin(int key, Shell win) {
		winList.put(key,win);		
	}
	
	public void processMsg(Message msg){
		log.debug("process message");
		/*synchronized (messages) {
			messages.add(msg);
		}
		synchronized(lock)
		{
			lock.notify();
		}*/
		
		String fn = "";
		JIMUser u = client.getUser().getFriend(msg.getFrom());
		if(u == null){
			fn = "陌生人";
		}else if(u.getNicknm()==null || u.getNicknm().equals("")){
			fn += u.getJimno();
		}else{
			fn += u.getNicknm();
		}
		log.info("\nGET A MESSAGE FROM " + fn+"["+msg.getFrom()+"]" + " "+msg.getSendTime().toLocaleString());
		log.info(msg.getContent());
		log.debug("process message out");
	}
	private  void showMsg(Message msg){
		log.debug("show messages");
		if(msg == null)
			return;	
		int from = msg.getFrom();
		ChatWin win = null;
		Shell  sh = MainWin.getWin(from);
		if(sh != null){
			log.debug("show messages");
			win =(ChatWin) sh;
			win.appendMsg(msg);
			win.setActive();
		}else{
			win = new ChatWin(display,SWT.SHELL_TRIM);
			JIMUser u = client.getUser().getFriend(from);
			String title="";
			if(u == null){
				title += from;
			}else if(u.getNicknm()==null ||u.getNicknm().equals("")){
				title += u.getJimno();
			}else{
				title += u.getNicknm();
			}
			win.setText(win.getText()+" - "+title);
			win.setKey(from);
			MainWin.putWin(win.getKey(),win);
			win.open();
			win.layout();
			win.appendMsg(msg);
			log.debug("show messages");
		}
		log.debug(msg.getContent());
	}
	
	protected Thread createMsgTh() {
		msgTh = new Thread() {
			public void run() {
				Message msg = null;
				Thread thisThread = Thread.currentThread();
				blinker = thisThread;
				while (blinker == thisThread) {
					if (messages.isEmpty()) {
						synchronized (lock) {
							try {
								lock.wait();
							} catch (InterruptedException e) {
								e.printStackTrace();
							}
						}
					}
					synchronized (messages) {
						msg = messages.poll();
					}
					showMsg(msg);
				}
			}
		};
		msgTh.setName("process message");
		//msgTh.run();
		display.asyncExec(msgTh);
		return msgTh;
	}
}

⌨️ 快捷键说明

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