首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-12-20 
用Java语言对QQ进行终极山寨---晴儿QQ诞生记之操作主界面好几天没上Javaeye了,最近几天日子一直很忙碌,弄

用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);//不启用修饰truett.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来实现的,至于具体怎么实现,我暂时还没有成熟的代码,悲剧。。。。。。第三:组件布局问题,在这个界面中我采用的是绝对定位的办法来定位组件,这也就出现了一个问题,改变大小时无法移动相应的组件,哎!哎!。。。。。。因为没太多的时间去仔细研究这个,暂时只能实现这个,好了,我得去泡个澡澡再来慢慢研究这几个纠结的问题啦,悄悄的,我走了,没带走一行多余的代码。。。。。。 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;  
这些自己写的吗? 2 楼 chen6485 2011-03-30   几个自定义组件必需得自己写啊,呵呵,我会开源的,因为代码很浅,贴出来很丢人的,我
已经找到更优秀的编码方式了,准备来次大换血,呵呵~ 3 楼 hejinxiqq 2011-04-07   牛叉,我还是看了一行代码而已,swing的布局真是麻烦很复杂 4 楼 chen6485 2011-04-07   hejinxiqq 写道牛叉,我还是看了一行代码而已,swing的布局真是麻烦很复杂
布局的问题真的是很纠结,我写这玩意儿的时候也纠结了很久,但是现在发现这些不过只是浮云,对于固定大小的我们可以使用setBounds(),对于大小变化的容器,我们可以先监听组件变化,然后使用这个使组件跟随组件变化而变化,在复杂的GUI程序里使用布局简直是一种痛苦,你得不断去研究不断去改变,索性,我现在不用布局了,就用绝对定位,而且照样很靓丽。 5 楼 wjlgryx 2011-04-08   问个问题,这个可以登陆吗?
6 楼 chen6485 2011-04-08   了,准备来次大换wjlgryx 写道问个问题,这个可以登陆吗?

暂时有关服务器端的代码正在研究之中,还没有成品,就不贴出来了..... 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啊~~ 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啊~~
不是第三方包,是重写后的组件,继承底层改变组件外观,网上有很多实例,你们可以参考参考,相关代码我正在研究,看能不能以更简洁的方式来实现,完成后将全部奉上..... 9 楼 gudujian6169 2012-03-20   源码616967508@qq.com

热点排行