`
chen6485
  • 浏览: 17967 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类

用Java语言对QQ进行终极山寨---晴儿QQ诞生记之操作主界面

阅读更多
         好几天没上Javaeye了,最近几天日子一直很忙碌,弄出来一个晴儿QQ的主界面,效果图如下:  
         
         代码如下:
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;
import com.component.StatusButton;
import com.component.SysButton;
import com.component.TTMenuItem;
import com.component.TTPanel;
import com.component.TTPopupMenu;
import com.componentListener.WinEventAdapter;
import com.componentUI.TScrollBarUI;
import com.sun.awt.AWTUtilities;
import com.uiresource.Resource;
import com.uiutil.UIUtil;
public class TT{
	/**阐述:该文件定义了晴儿QQ聊天软件的操作主界面
	 * 作者:陈阳(JavaEye博客:http://chen6485.iteye.com/)
	 * 说明:开发环境:MyEclipse6.6 JDK版本:Java(TM)SE Development Kit 6 Update 22
	 */
	private static final long serialVersionUID = -7757220015983708063L;
	private JButton close;
	private JButton max;
	private JButton restore;
	private JButton min;
	private JButton sys;
	private JDialog tt;
	private SysButton zone;
	private SysButton mail;
	private SysButton shop;
	private SysButton money;
	private SysButton news;
	private SysButton message;
	private SysButton color;
	private SysButton set;
	private SysButton manageTool;
	private StatusButton sta;
	private JScrollPane sc;
	private Resource res;
	private TTPanel panel;
	private Dimension screen;
	private JLabel userHead;
	private JLabel userNickname;
	private JLabel userSignatrue;
	private JLabel titleIma;
	private TTPopupMenu stat;
	private ImageIcon face;
	private String status;
	private String nick;
	private ImageIcon title;
	public TT(){
		initComponent();
		init();
	}
	public  void init(){
		screen=Toolkit.getDefaultToolkit().getScreenSize();//获取屏幕长宽
		tt=new JDialog(); 
		WinEventAdapter winMove=new WinEventAdapter(tt);
		tt.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
		tt.setUndecorated(true);//不启用修饰true
		tt.setSize(239,535);
		tt.setAlwaysOnTop(true);
		tt.addMouseListener(winMove);
		tt.addMouseMotionListener(winMove);
		AWTUtilities.setWindowOpaque(tt, false);
		panel=new TTPanel(tt);
		panel.setLayout(null);
		close.setBounds(tt.getWidth()-39, 0, 38, 18);
		max.setBounds(tt.getWidth()-64, 0, 25, 18);
		min.setBounds(tt.getWidth()-89, 0, 25, 18);
		sta.setBounds(60,25,36,23);
		zone.setBounds(7,75,23,23);
		mail.setBounds(35,75, 23, 23);
		shop.setBounds(63,75,23,23);
		money.setBounds(91,75,23,23);
		news.setBounds(119,75,23,23);
		message.setBounds(tt.getWidth()-56,75,23,23);
		set.setBounds(53,tt.getHeight()-28,23,23);
		manageTool.setBounds(80,tt.getHeight()-28,23,23);
		color.setBounds(tt.getWidth()-28,75,23,23);
		sys.setBounds(5,tt.getHeight()-42,41,41);
		sc.setBounds(2, 100,tt.getWidth()-4,tt.getHeight()-160);
		userNickname.setBounds(100,25,tt.getWidth(),20);
		userSignatrue.setBounds(65,46,139, 22);
		userHead.setBounds(15,25,40,40);
		titleIma.setBounds(2, 2, 90, 18);
		panel.add(close);
		panel.add(max);
		panel.add(min);
        panel.add(sta);		
		panel.add(zone);
		panel.add(mail);
		panel.add(shop);
		panel.add(money);
		panel.add(news);
		panel.add(message);
		panel.add(color);
		panel.add(sys);
		panel.add(sc);
		panel.add(set);
		panel.add(manageTool);
		panel.add(userNickname);
		panel.add(userSignatrue);
		panel.add(userHead);
		panel.add(titleIma);
		tt.setContentPane(panel);
		tt.setVisible(true);
		panel.repaint();
		tt.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
	}
	public void initComponent(){
		title=new ImageIcon(this.getClass().getResource("../image/title.png"));//QQ标题
		titleIma=new JLabel(title);
		userNickname=new JLabel();
		userNickname.setFont(new Font("黑体",Font.PLAIN,14));
		userSignatrue=new JLabel();
		userHead=new JLabel();
		try{
			Properties prop = new Properties();//Properties类表示了一个持久的属性集
			InputStream is = new FileInputStream("User/10001/Info.ini");
			InputStreamReader reader = new InputStreamReader (is,"GBK"); 
			prop.load(reader);
			if (reader!= null){
				status=prop.getProperty("status");//获取登陆状态
				nick=prop.getProperty("nickName");//获取昵称
				userSignatrue.setText(prop.getProperty("sigNatrue"));//获取个性签名
				String s=prop.getProperty("Ico");//获取头像
				face=new ImageIcon(this.getClass().getResource("../image/face/"+ s +".png"));
				reader.close();
			}else{
				System.out.println("无法读取文件");
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		userHead.setIcon(face);
		userNickname.setText(nick+"["+status+"]");
		stat=new TTPopupMenu();//状态选择下拉菜单
		TTMenuItem status1=new TTMenuItem("我在线上",res.onlineIcon);
		TTMenuItem status2=new TTMenuItem("Q我吧",res.tmeIcon);
		TTMenuItem status3=new TTMenuItem("离开",res.awayIcon);
		TTMenuItem status4=new TTMenuItem("忙碌",res.busyIcon);
		TTMenuItem status5=new TTMenuItem("请勿打扰",res.noIcon);
		TTMenuItem status6=new TTMenuItem("隐身",res.hideIcon);
		TTMenuItem status7=new TTMenuItem("离线",res.hideIcon);
		TTMenuItem status8=new TTMenuItem("关闭所有声音",res.hideIcon);
		TTMenuItem status9=new TTMenuItem("锁定晴儿QQ  Ctrl+Alt+L",null);
		TTMenuItem status10=new TTMenuItem("系统设置",null);
		TTMenuItem status11=new TTMenuItem("我的资料",null);
		TTMenuItem status12=new TTMenuItem("我的晴儿QQ中心",null);
		sc=new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);//好友滚动面板
		//sc.getViewport().setView();
		close=UIUtil.creatButton(res.close_normal, res.close_rollover, res.close_press);//关闭按钮
		max=UIUtil.creatButton(res.max_normal, res.max_rollover, res.max_press);//最大化按钮
		restore=UIUtil.creatButton(res.restore_normal, res.restore_rollover, res.restore_press);//还原大小按钮
		min=UIUtil.creatButton(res.min_normal, res.min_rollover, res.min_press);//最小化按钮
		sys=UIUtil.creatButton(res.sys_normal, res.sys_rollover, res.sys_press);//系统按钮
		zone=new SysButton(res.zone);//空间按钮
		mail=new SysButton(res.mail);//邮件按钮
		shop=new SysButton(res.shop);//商城按钮
		money=new SysButton(res.money);//钱包按钮
		news=new SysButton(res.news);//新闻按钮
		message=new SysButton(res.message);//消息按钮
		color=new SysButton(res.color);//颜色按钮
		set=new SysButton(res.set);//系统设置按钮
		manageTool=new SysButton(res.manageTool);//消息管理器按钮
		sta=new StatusButton(res.online,true);
		sc.setBorder(new EmptyBorder(0,0,0,0));
		sc.getVerticalScrollBar().setUI(new TScrollBarUI());//垂直滚动条
		sc.getHorizontalScrollBar().setUI(new TScrollBarUI());//平行滚动条
		stat.add(status1);
		stat.add(status2);
		stat.add(status3);
		stat.add(status4);
		stat.add(status5);
		stat.add(status6);
		stat.add(status7);
		stat.add(status8);
		stat.add(status9);
		stat.add(status10);
		stat.add(status11);
		stat.add(status12);
		status1.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				sta.setNormalImage(res.online);
				userNickname.setText(nick+"[我在线上]");
			}		
		});
		status2.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				sta.setNormalImage(res.tme);
				userNickname.setText(nick+"[Q我吧]");
			}		
		});
		status3.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				sta.setNormalImage(res.away );
				userNickname.setText(nick+"[离开]");
			}		
		});
		status4.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				sta.setNormalImage(res.busy);
				userNickname.setText(nick+"[忙碌]");
			}		
		});
		status5.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				sta.setNormalImage(res.no);
				userNickname.setText(nick+"[请勿打扰]");
			}		
		});
		status6.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				sta.setIcon(res.hideIcon);
				userNickname.setText(nick+"[隐身]");
			}		
		});
		status7.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				//sta.setIcon(res.onlineIcon);
				userNickname.setText(nick+"[隐身]");
			}		
		});
		status8.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
			}		
		});
		status9.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
			}		
		});
		status10.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
			}		
		});
		status11.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
			}		
		});
		status12.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
			}		
		});
		close.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				System.exit(0);
			}	
		});
		max.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				tt.setSize(screen.width,screen.height-30);
				tt.setLocation(0, 0);
				close.setBounds(tt.getWidth()-39, 0, 38, 18);
				panel.remove(max);
				panel.add(restore);
				restore.setBounds(tt.getWidth()-64, 0, 25, 18);
				min.setBounds(tt.getWidth()-89, 0, 25, 18);
				message.setBounds(tt.getWidth()-56, 75, 23, 23);
				color.setBounds(tt.getWidth()-28, 75, 23, 23);
				sys.setBounds(5,tt.getHeight()-42,41,41);
				sc.setBounds(2, 100,tt.getWidth()-4,tt.getHeight()-160);
				set.setBounds(53,tt.getHeight()-28,23,23);
				manageTool.setBounds(80,tt.getHeight()-28,23,23);
			}	
		});
		min.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				tt.setVisible(false);
			}	
		});
		restore.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				tt.setSize(239,535);
				tt.setLocation(0, 0);
				close.setBounds(tt.getWidth()-39,0,38,18);
				panel.remove(restore);
				panel.add(max);
				max.setBounds(tt.getWidth()-64,0,25,18);
				min.setBounds(tt.getWidth()-89,0,25,18);
				message.setBounds(tt.getWidth()-56,75,23,23);
				color.setBounds(tt.getWidth()-28,75,23,23);
				sys.setBounds(5,tt.getHeight()-42,41,41);
				sc.setBounds(2, 100,tt.getWidth()-4,tt.getHeight()-160);
				set.setBounds(53,tt.getHeight()-28,23,23);
				manageTool.setBounds(80,tt.getHeight()-28,23,23);
			}	
		});
		sta.addMouseListener(new MouseAdapter(){//状态选择按钮事件监听
	    	public void mouseClicked(MouseEvent e){
				if(e.getButton()==MouseEvent.BUTTON1){				
					stat.show(e.getComponent(),-5,20);
				}
	    	}
	    });
	}
	public static void main(String args[]){
		UIUtil.setSysFont();
		new TT();
	}
}

         这段代码贴出来多少有点寒酸,就一套号称可以对商用软件“终极”逆向的代码居然就这水平!用一句网络俏皮话来说,这不是在“坑爹”吗?哎!的确,这段代码中至少有三个问题没有解决,第一:字体问题,由AWTUtilities.setWindowOpaque(window, false)定义出来的圆角面板在绘制字体时会出现质量下降的问题,一时半会还真不知道该怎么解决,呜呜。。。。。。第二:好友区实现的问题,这个好友区应该是通过渲染JList来实现的,至于具体怎么实现,我暂时还没有成熟的代码,悲剧。。。。。。第三:组件布局问题,在这个界面中我采用的是绝对定位的办法来定位组件,这也就出现了一个问题,改变大小时无法移动相应的组件,哎!哎!。。。。。。因为没太多的时间去仔细研究这个,暂时只能实现这个,好了,我得去泡个澡澡再来慢慢研究这几个纠结的问题啦,悄悄的,我走了,没带走一行多余的代码。。。。。。
  • 大小: 22 KB
分享到:
评论
10 楼 giaalee 2015-11-04  
源码?没提供啊。
9 楼 gudujian6169 2012-03-20  
源码616967508@qq.com
8 楼 chen6485 2011-04-08  
Javac_MyLife 写道
wangping1213 写道
import com.component.StatusButton;  
import com.component.SysButton;  
import com.component.TTMenuItem;  
import com.component.TTPanel;  
import com.component.TTPopupMenu;  
import com.componentListener.WinEventAdapter;  
import com.componentUI.TScrollBarUI;  
import com.sun.awt.AWTUtilities;  
import com.uiresource.Resource;  
import com.uiutil.UIUtil;  
这些自己写的吗?


看着像第三方包。不懂swing啊~~

不是第三方包,是重写后的组件,继承底层改变组件外观,网上有很多实例,你们可以参考参考,相关代码我正在研究,看能不能以更简洁的方式来实现,完成后将全部奉上.....
7 楼 Javac_MyLife 2011-04-08  
wangping1213 写道
import com.component.StatusButton;  
import com.component.SysButton;  
import com.component.TTMenuItem;  
import com.component.TTPanel;  
import com.component.TTPopupMenu;  
import com.componentListener.WinEventAdapter;  
import com.componentUI.TScrollBarUI;  
import com.sun.awt.AWTUtilities;  
import com.uiresource.Resource;  
import com.uiutil.UIUtil;  
这些自己写的吗?


看着像第三方包。不懂swing啊~~
6 楼 chen6485 2011-04-08  
了,准备来次大换
wjlgryx 写道
问个问题,这个可以登陆吗?

暂时有关服务器端的代码正在研究之中,还没有成品,就不贴出来了.....
5 楼 wjlgryx 2011-04-08  
问个问题,这个可以登陆吗?
4 楼 chen6485 2011-04-07  
hejinxiqq 写道
牛叉,我还是看了一行代码而已,swing的布局真是麻烦很复杂

布局的问题真的是很纠结,我写这玩意儿的时候也纠结了很久,但是现在发现这些不过只是浮云,对于固定大小的我们可以使用setBounds(),对于大小变化的容器,我们可以先监听组件变化,然后使用这个使组件跟随组件变化而变化,在复杂的GUI程序里使用布局简直是一种痛苦,你得不断去研究不断去改变,索性,我现在不用布局了,就用绝对定位,而且照样很靓丽。
3 楼 hejinxiqq 2011-04-07  
牛叉,我还是看了一行代码而已,swing的布局真是麻烦很复杂
2 楼 chen6485 2011-03-30  
几个自定义组件必需得自己写啊,呵呵,我会开源的,因为代码很浅,贴出来很丢人的,我
已经找到更优秀的编码方式了,准备来次大换血,呵呵~
1 楼 wangping1213 2011-03-29  
import com.component.StatusButton;  
import com.component.SysButton;  
import com.component.TTMenuItem;  
import com.component.TTPanel;  
import com.component.TTPopupMenu;  
import com.componentListener.WinEventAdapter;  
import com.componentUI.TScrollBarUI;  
import com.sun.awt.AWTUtilities;  
import com.uiresource.Resource;  
import com.uiutil.UIUtil;  
这些自己写的吗?

相关推荐

    java--QQ java--QQjava--QQjava--QQ

    然而,考虑到标题中的上下文,可以推测这可能是在强调Java和QQ的结合使用,或者是在进行某种循环或迭代操作,这在编程中是常见的。如果这是一个项目描述,那么可能是在说明项目的核心是围绕着Java平台与QQ服务的交互...

    java语言 山寨版QQ源码

    【标题】:“java语言 山寨版QQ源码”指的是基于Java编程语言实现的一个简易QQ聊天软件的源代码。这个项目通常是为了教学目的而设计,让学习者能够深入理解Java编程语言在网络通信、多线程、图形用户界面(GUI)等...

    java版山寨QQ项目源码

    java版山寨QQ项目 里面有四个压缩包 QQ服务器端.rar QQ客户端.rar 改进QQ客户机服务器视频实现.rar Q第三方库.rar 这个java版山寨QQ项目实现的功能有: 1.实现的java视频聊天; 2.集成了Mina框架; 3.服务器管理...

    山寨版QQ--存Java实现!!

    通过这个项目,开发者不仅可以学习到Java的基础知识,还能掌握到如何利用Java进行用户界面设计、数据库操作以及网络通信等高级技能。虽然聊天功能尚未实现,但其现有功能已经充分展现了Java语言的灵活性和实用性,...

    QQ蜗牛终极版--服务器发包工具

    QQ蜗牛终极版--服务器发包工具D人必备

    Java开发案例-springboot-15-QQ第三方登录-源代码+文档.rar

    Java开发案例-springboot-15-QQ第三方登录-源代码+文档.rar Java开发案例-springboot-15-QQ第三方登录-源代码+文档.rar Java开发案例-springboot-15-QQ第三方登录-源代码+文档.rar Java开发案例-springboot-15-QQ第...

    java 界面--QQ 代码

    总的来说,"java 界面--QQ 代码"项目涵盖了Swing GUI开发的基本知识,包括组件使用、事件处理、文件操作以及基础的异常和测试概念,是一个学习和实践Java GUI编程的好实例。在实际开发中,还需要考虑更多的因素,如...

    JAVA-QQ-chat-system-instructions.rar_QQ_QQ java_java qq

    【标题】"JAVA-QQ-chat-system-instructions.rar" 提供了一个使用Java编程语言构建QQ聊天系统的详细指南。这个教程可能是为了帮助开发者理解如何利用Java技术实现一个类似QQ的即时通讯平台。 【描述】"JAVA QQ chat...

    java实现的山寨版QQ

    【Java实现的山寨版QQ】项目是一个基于Java编程语言开发的即时通讯软件,它旨在模拟腾讯QQ的基本功能,包括用户登录、在线好友列表展示、一对一私聊以及多人聊天室等功能。这个项目对于学习Java GUI设计、网络编程...

    weixin-java-miniapp-2.8.0-API文档-中文版.zip

    赠送jar包:weixin-java-miniapp-2.8.0.jar; 赠送原API文档:weixin-java-miniapp-2.8.0-javadoc.jar; 赠送源代码:weixin-java-miniapp-2.8.0-sources.jar; 赠送Maven依赖信息文件:weixin-java-miniapp-2.8.0....

    Java实习报告——山寨QQ聊天工具设计

    【Java实习报告——山寨QQ聊天工具设计】 这份实习报告详细记录了一个基于Java的简易聊天系统的开发过程,项目名为"My_QQ",旨在模仿QQ的基本功能,包括登录、注册、单人及多人聊天,并且退出应用。这个项目是针对...

    java山寨版qq项目

    【Java山寨版QQ项目】是韩顺平老师为了教学目的设计的一个模拟QQ功能的应用程序,旨在帮助初学者理解和掌握Java编程语言以及相关的软件开发技术。这个项目提供了从基础到进阶的Java编程实践,涵盖了网络通信、多线程...

    山寨QQ2003java源码

    【标题】"山寨QQ2003java源码"揭示了这是一个基于Java编程语言的项目,目的是模仿QQ2003版本的某些功能。在Java领域,源码是程序员编写的程序原始代码,用于实现特定的功能。这个项目可能是为了学习、研究或者改进,...

    最新java模拟登陆QQ空间【2017-12-22】有效

    1.获取QQ空间qzonetoken值 2.构造p参数加密方式getEncryption(QQ密码,QQ账号[16进制标识],验证码,false); 3.获取g_tk算法更新 4.cookie值p_skey,RK,pt4_token,pt_login_sig,ptdrvs,ptvfsession,skey,superkey,...

    山寨java版qq

    【标题】"山寨java版qq" 是一个基于Java编程语言开发的简易聊天软件,它旨在模仿QQ的功能,但并非官方版本。这个项目主要是为了学习和实践网络通信、多线程以及用户界面设计等技术。 【描述】这个"山寨版局域网聊天...

    用JAVA语言编写:山寨版QQ课程设计报告

    【标题】:“用JAVA语言编写:山寨版QQ课程设计报告” 【描述】:“用JAVA编写的QQ聊天工具!有流程图 还有图形界面” 【标签】:“山寨QQ” 【正文】: 本课程设计旨在实现一个基于JAVA的即时通讯工具,模仿QQ...

    java GUI 山寨QQ

    【标题】"java GUI 山寨QQ"是一个基于Java Standard Edition (Java SE) 开发的图形用户界面(GUI)应用程序,旨在模仿QQ即时通讯软件的功能。这个项目展示了如何利用Java的Swing或JavaFX库来构建桌面应用,并通过SQL...

    QQ设置界面---eclipse

    QQ设置界面在IT行业中是一个常见的用户交互界面,尤其在开发桌面应用时,它扮演着提供个性化设置、账户管理等重要功能的角色。Eclipse是一个广泛使用的Java集成开发环境(IDE),它支持多种插件开发,包括创建这样的...

    java 仿QQ登陆界面 主界面

    java 仿QQ登陆界面 主界面java 仿QQ登陆界面 主界面java 仿QQ登陆界面 主界面 效果可以去我QQ空间看 http://user.qzone.qq.com/309306055/infocenter#!app=2&pos=1337351044

    Android仿QQ主界面-------完善篇

    此外,为了实现QQ主界面的动画效果和滑动手感,你可能需要对`ViewPager`进行一些自定义设置,如设置滑动速度、滑动监听等。例如,可以使用`setPageTransformer()`添加页面转换动画,或者通过`...

Global site tag (gtag.js) - Google Analytics