QQ好友列表树形列表java代码实现代码
以前在网上瞎转悠的时候就发现很多人为用java实现qq登陆后的面板的问题感到十分头疼,最近我因在写模拟qq的项目,故不可或缺的遇到了这一个问题,在网上我google了,百度了,最终发现的是有很多人被这一问题困扰,却没有解决的方案,估计是那些写出来了的人,没有发布到网上来,如今,经过自己的多方面查找资料,终于把他写出来了,也不枉昨晚熬夜了,呵呵,好了先让我们来看看实现的效果截图:
好了,效果就是这样了,虽然实现了基本功能,但是还是不完美,比如说好友面板不能随着窗口改变大小而改变,不过应该已经可以解决了,只是还没实践,下面就发上源代码:
一共有三个类:
membermodel.java //显示类qq似好友标签信息的模板类;
testpane.java //添加多个模板的容器类;
testframe.java //窗体类;
核心部分是前面两个类,注意,第二个类的布局方式不能为空,否则不能是容器显示滚动条,这是实现这个面板功能的一个难题,因为我不怎么会使用其他的布局方式,就只经常用空布局,经过这次才知道,光用空布局是不行的,空布局的应用受到了太多的限制。
在testpane.java中添加好友信息的方式应该是代码添加黑名单信息的方式,可在其他类中调用方法,传递参数(数组)过来,然后对信息模板进行初始化,还有面板上的信息模板从程序刚开始运行就生成了,只是设置了不可见,后点击相关分类标签后的可视与不可视是同理的,也就是说你有多少个好友就一直会有多少个jlabel存在你的面板上,只是你可能看不见他们,我感觉自己的实现方式不是很好。还有在我所用的这种布局方式中,显示label的宽度是一定的,我不知道怎么设置他的宽度和高度,所以通过在label上添加了一个白色图标(185 x 60)来使label变宽,然后再添加模板jpanel,如果网友们还有好的解决方法,希望不吝赐教。
下面是源码:
package coolbaby6; import javax.swing.imageicon; import javax.swing.jpanel; import javax.swing.jbutton; import java.awt.color; import java.awt.rectangle; import javax.swing.jlabel; import java.awt.dimension; import java.awt.font; public class membermodel{ private static final long serialversionuid = 1l; public jbutton jbutton = null;//显示好友头像; public jpanel jpanel = new jpanel();//模板容器; private jlabel lb_nickname = null;//显示昵称; private int pic; private string nickname = null; private jlabel lb_mood = null;//显示心情; public membermodel(int pic, string nickname, int len) { super(); this.pic = pic;//头像编(有多种方法可以实现,这种最简单) this.nickname = nickname;//昵称; initialize(); } private void initialize() { lb_mood = new jlabel(); lb_mood.setbounds(new rectangle(51, 30, 131, 20)); lb_mood.setfont(new font("dialog", font.plain, 12)); lb_mood.settext("世界上最遥远的距离不是生与死,而是我站在你面前你却不知道我爱你!"); lb_mood.addmouselistener(new java.awt.event.mouseadapter() { public void mouseentered(java.awt.event.mouseevent e) { exchangeenter(); lb_mood.settooltiptext(lb_mood.gettext()); } public void mouseexited(java.awt.event.mouseevent e) { exchangeexited(); } }); lb_nickname = new jlabel(); lb_nickname.setbounds(new rectangle(52, 10, 80, 20)); lb_nickname.setfont(new font("dialog", font.bold, 14)); lb_nickname.settext(nickname); jpanel.setsize(new dimension(185, 60)); jpanel.setlayout(null); jpanel.add(getjbutton(), null); jpanel.add(lb_nickname, null); jpanel.add(lb_mood, null); jpanel.addmouselistener(new java.awt.event.mouseadapter() { public void mouseexited(java.awt.event.mouseevent e) { exchangeexited();//鼠标移出模板区,改变背景颜色; } public void mouseentered(java.awt.event.mouseevent e) { exchangeenter();//鼠标移进模板区,改变背景颜色; } }); } private void exchangeenter() { jpanel.setbackground(new color(192,224,248)); } private void exchangeexited() { jpanel.setbackground(null); } private jbutton getjbutton() { if (jbutton == null) { jbutton = new jbutton(); jbutton.setbounds(new rectangle(8, 10, 40, 40)); jbutton.setbackground(new color(236, 255, 236)); jbutton.seticon(new imageicon(pic + ".jpg")); jbutton.addmouselistener(new java.awt.event.mouseadapter() { public void mouseexited(java.awt.event.mouseevent e) { exchangeexited();//鼠标移出模板区,改变背景颜色; } public void mouseentered(java.awt.event.mouseevent e) { exchangeenter();//鼠标移进模板区,改变背景颜色; } }); } return jbutton; } }
package coolbaby6; import javax.swing.borderfactory; import javax.swing.jpanel; import javax.swing.jlabel; import javax.swing.boxlayout; import javax.swing.imageicon; public class testpane extends jpanel { private static final long serialversionuid = 1l; private jlabel jlabel = null; private jlabel jlabel1 = null; private jlabel jlabel11 = null; private jlabel jlabel12 = null; private int clickf=0; private int clickb=0; public testpane() { super(); initialize(); } private void initialize() { jlabel12 = new jlabel(); jlabel12.seticon(new imageicon("img/bg.jpg")); jlabel12.add(new membermodel(3,"coolbaby3",200).jpanel); jlabel12.setborder(borderfactory.createemptyborder(2, 2, 2, 2)); jlabel11 = new jlabel(); jlabel11.seticon(new imageicon("img/bg.jpg")); jlabel11.add(new membermodel(2,"coolbaby2",200).jpanel); jlabel11.setborder(borderfactory.createemptyborder(2, 2, 2, 2)); jlabel1 = new jlabel(); jlabel1.seticon(new imageicon("img/bg.jpg")); jlabel1.add(new membermodel(1,"coolbaby1",200).jpanel); jlabel1.setborder(borderfactory.createemptyborder(2, 2, 2, 2)); jlabel = new jlabel(); jlabel.settext("我的好友"); jlabel.seticon(new imageicon("img/ico.jpg")); jlabel.setborder(borderfactory.createemptyborder(2, 2, 2, 2)); jlabel.addmouselistener(new java.awt.event.mouseadapter() { public void mouseclicked(java.awt.event.mouseevent e) { clickf+=1; if(clickf%2==1){ jlabel1.setvisible(false); jlabel11.setvisible(false); jlabel12.setvisible(false); jlabel.seticon(new imageicon("img/ico2.jpg")); update(); }else{ jlabel1.setvisible(true); jlabel11.setvisible(true); jlabel12.setvisible(true); jlabel.seticon(new imageicon("img/ico.jpg")); update(); } } }); this.setlayout(new boxlayout(this, boxlayout.y_axis)); this.setsize(200, 408); this.setlocation(20, 5); this.add(jlabel, null); this.add(jlabel1, null); this.add(jlabel11, null); this.add(jlabel12, null); addjlabel(); } private void update(){//更新ui界面; this.updateui(); } private void clickblack2(jlabel []jb){//点击标签,将后面的标签全部设为不可视; for(int i=1;i<jb.length;i++){ try{ jb[i].setvisible(false); }catch(exception e){ e.printstacktrace(); } } update(); } private void clickblack(jlabel []jb){//点击标签,将后面的标签全部设为可视; for(int i=1;i<jb.length;i++){ try{ jb[i].setvisible(true); }catch(exception e){ e.printstacktrace(); } } update(); } private void addjlabel(){//添加黑名单的内容; final jlabel []jb=new jlabel[7]; jb[0] = new jlabel(); jb[0].settext("黑名单"); jb[0].seticon(new imageicon("img/ico2.jpg")); jb[0].setborder(borderfactory.createemptyborder(2, 2, 2, 2)); jb[0].addmouselistener(new java.awt.event.mouseadapter() { public void mouseclicked(java.awt.event.mouseevent e) { clickb+=1; if(clickb%2==1){ clickblack(jb); jb[0].seticon(new imageicon("img/ico.jpg")); }else{ clickblack2(jb); jb[0].seticon(new imageicon("img/ico2.jpg")); } } }); this.add(jb[0],null); for(int i=1;i<jb.length;i++){ jb[i]=new jlabel(); jb[i].seticon(new imageicon("img/bg.jpg")); jb[i].setborder(borderfactory.createemptyborder(2, 2, 2, 2)); jb[i].add(new membermodel((i+3),"coolbaby"+(i+3),200).jpanel); jb[i].setvisible(false); this.add(jb[i],null); } } }
package coolbaby6; import java.awt.borderlayout; import javax.swing.jframe; import javax.swing.jpanel; import javax.swing.jscrollpane; import javax.swing.scrollpaneconstants; import javax.swing.swingutilities; public class testframe { private jframe jframe = null; private jpanel jcontentpane = null; private jscrollpane scrollpane=null; public static void main(string[] args) { swingutilities.invokelater(new runnable() { public void run() { testframe application = new testframe(); application.getjframe().setvisible(true); } }); } private jframe getjframe() { if (jframe == null) { jframe = new jframe(); jframe.setdefaultcloseoperation(jframe.exit_on_close); jframe.setsize(230, 700); jframe.settitle("模拟实现qq面板功能"); jframe.setcontentpane(getjcontentpane()); } return jframe; } private jscrollpane getscrollpane(){//给添加好友的容器jpanel添加滚动条; if(scrollpane==null){ scrollpane=new jscrollpane(new testpane()); //scrollpane.setbounds(20,5, -1, 600); scrollpane.sethorizontalscrollbarpolicy(scrollpaneconstants.horizontal_scrollbar_never );//不显示水平滚动条; } return scrollpane; } private jpanel getjcontentpane() {//实例化底层的容器jpanel; if (jcontentpane == null) { jcontentpane = new jpanel(); jcontentpane.setlayout(new borderlayout()); jcontentpane.add(getscrollpane(), borderlayout.center); } return jcontentpane; } }
能成功编译成功我的源代码的方略:
①、建一个项目,按我的类名建3个类,将源代码拷贝进去;
②、在项目根目录下建一个名为img的文件夹,将要用到的图片放进去。(相关图片不再上传了,自己随便找几个图片测试即可)
③、编译实现;
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。