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

📄 mainpane.java

📁 一个简单的程序稳操胜券用拖把有稳操胜券
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
	private FriendUser getFriendUserFromList(int jqnum){
		for(int i=0;i<listFriend.getModel().getSize();i++){
			Object obj = listFriend.getModel().getElementAt(i);
			if(obj instanceof FriendUser){
				FriendUser friendUser = (FriendUser)obj;
				if(friendUser.getJqnum()==jqnum)
					return friendUser;
			}
		}
		return null;
	}
	
	/**
	 * 退出事件。
	 */
	private void quit(){
		JQMessage message = new JQMessage();
		message.setType(24);
		message.setObj(selfUser);
		try {
			oos.writeObject(message);
			oos.flush();
		} catch (IOException e) {
			e.printStackTrace();
		}
		closeClient();
		thread.interrupt();
		System.exit(0);
	}
	
	/*public static void main(String[] args) {
		try {
			//System.out.println(JQClient.class.getResource("../tools/simsun.ttc").getPath());
			Font font = Font.createFont(Font.TRUETYPE_FONT, new File(MainPane.class.getResource("/tools/simsun.ttc").getPath()));
			font = font.deriveFont(Font.PLAIN, 12);
			SetFont.setFont(font);
		} catch (FontFormatException e) {
			System.out.println("错误:"+e.getMessage());
		} catch (IOException e) {
			System.out.println("错误:"+e.getMessage());
		}
		new MainPane("",0,0,"",1);
	}*/

	/**
	 * 窗体关闭时触发事件。
	 */
	private class MyWindowAdapter extends WindowAdapter{
		public void windowClosing(WindowEvent e) {
			//super.windowClosing(e);
			quit();
		}
	}
	
	/**
	 * 自己定制的好友类表的ListCellRenderer
	 * 2008-9-27
	 * @author		达内科技[Tarena Training Group]
	 * @version	1.0
	 * @since		JDK1.6(建议) 
	 */
	private class CompanyLogoListCellRenderer extends DefaultListCellRenderer {
        public Component getListCellRendererComponent(JList list,Object value,int index,boolean isSelected,boolean cellHasFocus){
        	Component retValue = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        	//System.out.println(value.toString());
        	if(value instanceof FriendUser){
        		FriendUser user = (FriendUser)value;
        		setIcon(new Portrait(user.getPhoto(),user.getState()));
        		setToolTipText("<html>"+user.getNickName()+"["+user.getJqnum()+"]"+"<br><font color='red'>"+user.getSignature()+"</font></html>");
        	}
        	return retValue;
         } 
     }
	
	/**
	 * 鼠标事件,完成鼠标进入好友List中,选中好友,双击与好友进行聊天等。
	 * 2008-9-27
	 * @author		达内科技[Tarena Training Group]
	 * @version	1.0
	 * @since		JDK1.6(建议) 
	 */
	private class ListMouseAdapter extends MouseAdapter{
		public void mouseMoved(MouseEvent e) {
			//System.out.println(e.getSource());
			if(e.getSource()==listFriend){
				listFriend.clearSelection();
				int index = listFriend.locationToIndex(e.getPoint());
				//System.out.println("index:"+index);
				listFriend.setSelectedIndex(index);
			}
		}
		public void mouseClicked(MouseEvent e) {
			if(e.getSource()==listFriend ){
				if(e.getClickCount()==2){
					chatWithFriend();
				}
				if(e.getButton()==MouseEvent.BUTTON3){
					popupMenu.show(listFriend, e.getX(), e.getY());
				}
				return;
			}
			if(e.getSource()==btnMenu){
				menu.show(btnMenu, e.getX()-25, e.getY()-75);
			}
			if(e.getSource()==btnSys){
				broadcastwindow.showNow();
			}
		}
	}
	
	/**
	 * 打开好友聊天窗口。
	 */
	private void chatWithFriend(){
		Object obj = listFriend.getSelectedValue();
		if(obj instanceof FriendUser){
			FriendUser friendUser = (FriendUser)obj;
			int jqnum = friendUser.getJqnum();
			ChatPane chatPane = chat.get(jqnum);
			if(chatPane==null){
				chatPane = new ChatPane(oos,friendUser,selfUser,true);
				chat.put(jqnum, chatPane);
			}
			else if(chatPane.isDisplayable()){
				chatPane.setFocusable(true);
				chatPane.setState(NORMAL);
			}
			else{
				chatPane.setVisible(true);
			}
		}
	}
	
	/**
	 * 登陆线程。处理服务端的信息以及发送消息到服务端。
	 * 2008-9-27
	 * @author		达内科技[Tarena Training Group]
	 * @version	1.0
	 * @since		JDK1.6(建议) 
	 */
	private class LoginThread extends Thread{
		
		public LoginThread(){
			try {
				client = new Socket(serverIp,serverPort);
				MainPane.this.addWindowListener(new MyWindowAdapter());
				oos = new ObjectOutputStream(new BufferedOutputStream(client.getOutputStream()));
				LoginUser loginUser = new LoginUser();
				loginUser.setJqnum(jqnum);
				loginUser.setPassword(password);
				loginUser.setState(state);
				JQMessage message = new JQMessage();
				message.setType(20);
				message.setObj(loginUser);
				new WriteThread(message).start();
				ois = new ObjectInputStream(new BufferedInputStream(client.getInputStream()));
				//oos = new ObjectOutputStream(client.getOutputStream());
				//ois = new ObjectInputStream(client.getInputStream());
			} catch (UnknownHostException e) {
				closeClient();
				JOptionPane.showMessageDialog(null, "请确保输入的服务器IP和端口正确!"+e.getMessage());
				dispose();
				new LoginPane();
			} catch (IOException e) {
				closeClient();
				JOptionPane.showMessageDialog(null, "请确保输入的服务器IP和端口正确!"+e.getMessage());
				dispose();
				new LoginPane();
			}
		}
		
		public void run() {
			try {
				JQMessage message = null;
				while(ois!=null){
					Object obj = ois.readObject();
					if(obj instanceof JQMessage){
						message = (JQMessage)obj;
						int type =  message.getType();
						switch(type){
						case 21://登陆成功
							if(message.getObj() instanceof Vector)	{							
								Vector<FriendUser> v = (Vector)message.getObj();
								initMain(v);
							}
							break;
						case 22://登录失败
							closeClient();
							JOptionPane.showMessageDialog(null, message.getObj().toString());
							dispose();
							new LoginPane();
							break;
						case 23://账号在别处登录
							causeLetClientQuit(message);
							break;
						case 25://好友上线
							dealFriendUserLogin(message);
							break;
						case 31://接收到消息
							dealRecord(message.getObj(),type);
							break;
						case 41://接受当前在线用户数
							dealOnlineNum(message.getObj());
							break;
						case 43://接受在线的用户显示到table上
							dealShowOnlineUser(message.getObj());
							break;
						case 45:
							JOptionPane.showMessageDialog(null, message.getObj().toString());
							break;
						case 46:
							JOptionPane.showMessageDialog(null, message.getObj().toString());
							break;
						case 90://服务端退出
							causeLetClientQuit(message);
							break;
						case 91:
							dealBroadcast(message);
							break;
						}
					}
				}
			} catch (IOException e) {
				System.out.println("发生异常:"+e.getMessage());
				closeClient();
				JOptionPane.showMessageDialog(null, "和服务端连接发生错误:"+e.getMessage()+",请重新登录!");
				System.exit(0);
			} catch (ClassNotFoundException e) {
				System.out.println("发生异常:"+e.getMessage());
				closeClient();
				JOptionPane.showMessageDialog(null, "和服务端连接发生错误:"+e.getMessage()+",请重新登录!");
				System.exit(0);
			}
		}
	}
	
	/**
	 * 处理广播。
	 * @param message JQMessage消息对象。
	 */
	private void dealBroadcast(JQMessage message){
		newMSG(message.getType());
		if(broadcastwindow!=null){
			broadcastwindow.txt.setText(message.getObj().toString());
			broadcastwindow.showNow();
		}		
	}
	
	/**
	 * 有消息来时出发声音。
	 * @param type 消息的类型。
	 */
	private void newMSG(int type){
		//播放*.au文件时建议使用下面的方法
//		AudioClip audioClip = null;
//		if(n==31)
//		audioClip = Applet.newAudioClip(MainPane.class.getResource("../sound/msg.au"));
//		if(n==91)
//			audioClip = Applet.newAudioClip(MainPane.class.getResource("../sound/system.au"));
//		audioClip.play();
		//播放*.wav文件时建议使用下面的方法
		try {
			AudioStream audioStream = null;
			switch (type) {
			case 25:
				audioStream = new AudioStream(getClass().getResourceAsStream("/client/sound/global.wav"));
				break;
			case 31:
				audioStream = new AudioStream(getClass().getResourceAsStream("/client/sound/msg.wav"));
				break;
			case 91:
				audioStream = new AudioStream(getClass().getResourceAsStream("/client/sound/system.wav"));
				break;
			default:
				audioStream = new AudioStream(getClass().getResourceAsStream("/client/sound/msg.wav"));
				break;
			}
			AudioPlayer.player.start(audioStream);
		} catch (IOException e) {
			System.out.println("在播放声音文件时[type="+type+"],发生异常:"+e.getMessage());
		}
	}
	
	/**
	 * 处理好友上线时消息。
	 * @param message
	 */
	private void dealFriendUserLogin(JQMessage message){
		Object obj  = message.getObj();
		if(obj instanceof FriendUser){
			newMSG(message.getType());
			FriendUser friendUser = (FriendUser)obj;
			if(listModel.contains(friendUser)){
				for(int i=0;i<listModel.getSize();i++){
					Object object = listModel.get(i);
					if(object instanceof FriendUser){
						FriendUser user = (FriendUser)object;
						if(user.equals(friendUser)){
							user.setState(friendUser.getState());
							user.setPhoto(friendUser.getPhoto());
							user.setNickName(friendUser.getNickName());
							user.setSignature(friendUser.getSignature());
							listFriend.repaint();
							break;
						}
					}
				}
				//更改聊天窗口的图标
				ChatPane chatPane = chat.get(friendUser.getJqnum());
				if(chatPane!=null)
					chatPane.updateFriendPhoto(new Portrait(friendUser.getPhoto(),friendUser.getState(),false));
			}else{
				listModel.addElement(friendUser);
				chat.put(friendUser.getJqnum(), null);
				listFriend.repaint();
			}	
		}
	}
	
	/**
	 * 根据服务端发送的消息,将在线用户显示到查找面板上。
	 * @param obj 在线用户。
	 */
	private void dealShowOnlineUser(Object obj){
		if(obj instanceof FriendUser)
			findWindow.addOnlineUser((FriendUser)obj);
	}
	
	/**
	 * 显示在线用户数到查找面板上。
	 * @param obj 在线用户数。
	 */
	private void dealOnlineNum(Object obj){
		if(obj instanceof Integer){
			int size = (Integer)obj;
			findWindow.lblOnlineNum.setText("当前在线人数 :   "+size);
		}
	}
	
	/**
	 * 处理服务端发送的从好友发过来的消息。
	 * @param obj Record对象。
	 * @param type 消息类型。

⌨️ 快捷键说明

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