1. 程式人生 > >QQ好友列表樹形列表簡單實現方式

QQ好友列表樹形列表簡單實現方式


        以前在網上瞎轉悠的時候就發現很多人為用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的資料夾,將要用到的圖片放進去。(相關圖片不再上傳了,自己隨便找幾個圖片測試即可)

③、編譯實現;