最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

QQ好友列表樹形列表java代碼實(shí)現(xiàn)代碼

 更新時間:2016年08月29日 15:49:18   作者:ycb1689  
這篇文章主要為大家詳細(xì)介紹了QQ好友列表樹形列表簡單實(shí)現(xiàn)方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下

以前在網(wǎng)上瞎轉(zhuǎn)悠的時候就發(fā)現(xiàn)很多人為用Java實(shí)現(xiàn)QQ登陸后的面板的問題感到十分頭疼,最近我因在寫模擬QQ的項目,故不可或缺的遇到了這一個問題,在網(wǎng)上我google了,百度了,最終發(fā)現(xiàn)的是有很多人被這一問題困擾,卻沒有解決的方案,估計是那些寫出來了的人,沒有發(fā)布到網(wǎng)上來,如今,經(jīng)過自己的多方面查找資料,終于把他寫出來了,也不枉昨晚熬夜了,呵呵,好了先讓我們來看看實(shí)現(xiàn)的效果截圖: 


      好了,效果就是這樣了,雖然實(shí)現(xiàn)了基本功能,但是還是不完美,比如說好友面板不能隨著窗口改變大小而改變,不過應(yīng)該已經(jīng)可以解決了,只是還沒實(shí)踐,下面就發(fā)上源代碼:

一共有三個類: 

MemberModel.java //顯示類QQ似好友標(biāo)簽信息的模板類;        

TestPane.java    //添加多個模板的容器類;             

TestFrame.java   //窗體類;

核心部分是前面兩個類,注意,第二個類的布局方式不能為空,否則不能是容器顯示滾動條,這是實(shí)現(xiàn)這個面板功能的一個難題,因為我不怎么會使用其他的布局方式,就只經(jīng)常用空布局,經(jīng)過這次才知道,光用空布局是不行的,空布局的應(yīng)用受到了太多的限制。

在TestPane.java中添加好友信息的方式應(yīng)該是代碼添加黑名單信息的方式,可在其他類中調(diào)用方法,傳遞參數(shù)(數(shù)組)過來,然后對信息模板進(jìn)行初始化,還有面板上的信息模板從程序剛開始運(yùn)行就生成了,只是設(shè)置了不可見,后點(diǎn)擊相關(guān)分類標(biāo)簽后的可視與不可視是同理的,也就是說你有多少個好友就一直會有多少個JLabel存在你的面板上,只是你可能看不見他們,我感覺自己的實(shí)現(xiàn)方式不是很好。還有在我所用的這種布局方式中,顯示Label的寬度是一定的,我不知道怎么設(shè)置他的寬度和高度,所以通過在Label上添加了一個白色圖標(biāo)(185 X 60)來使Label變寬,然后再添加模板JPanel,如果網(wǎng)友們還有好的解決方法,希望不吝賜教。

下面是源碼:

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;//頭像編(有多種方法可以實(shí)現(xiàn),這種最簡單)
 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("世界上最遙遠(yuǎn)的距離不是生與死,而是我站在你面前你卻不知道我愛你!");
 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();//鼠標(biāo)移出模板區(qū),改變背景顏色;
  }

  public void mouseEntered(java.awt.event.MouseEvent e) {
  exchangeEnter();//鼠標(biāo)移進(jìn)模板區(qū),改變背景顏色;
  }
 });
 }

 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();//鼠標(biāo)移出模板區(qū),改變背景顏色;
  } 
  public void mouseEntered(java.awt.event.MouseEvent e) {  
   exchangeEnter();//鼠標(biāo)移進(jìn)模板區(qū),改變背景顏色;
  }
  });
 
 }
 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){//點(diǎn)擊標(biāo)簽,將后面的標(biāo)簽全部設(shè)為不可視;
 for(int i=1;i<jb.length;i++){
  try{
  jb[i].setVisible(false);
  }catch(Exception e){
  e.printStackTrace();
  }
 } 
 update();
 }
 private void clickBlack(JLabel []jb){//點(diǎn)擊標(biāo)簽,將后面的標(biāo)簽全部設(shè)為可視;
 for(int i=1;i<jb.length;i++){
  try{
  jb[i].setVisible(true);
  }catch(Exception e){
  e.printStackTrace();
  }
  
 } 
 update();
 }

 private void addJLabel(){//添加黑名單的內(nèi)容;
 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("模擬實(shí)現(xiàn)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() {//實(shí)例化底層的容器JPanel;
 if (jContentPane == null) {
  jContentPane = new JPanel();
  jContentPane.setLayout(new BorderLayout());
  jContentPane.add(getScrollPane(), BorderLayout.CENTER);
 }
 return jContentPane;
 }
}

能成功編譯成功我的源代碼的方略: 
①、建一個項目,按我的類名建3個類,將源代碼拷貝進(jìn)去; 
②、在項目根目錄下建一個名為img的文件夾,將要用到的圖片放進(jìn)去。(相關(guān)圖片不再上傳了,自己隨便找?guī)讉€圖片測試即可) 
③、編譯實(shí)現(xiàn);

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)原理與用法詳解

    Java分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)原理與用法詳解

    這篇文章主要介紹了Java分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)原理與用法,結(jié)合實(shí)例形式分析了java分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、跳轉(zhuǎn)語句等相關(guān)概念、原理、使用技巧與操作注意事項,需要的朋友可以參考下
    2020-02-02
  • SpringBoot自動配置的原理詳解

    SpringBoot自動配置的原理詳解

    這篇文章主要介紹了SpringBoot自動配置的原理詳解,本節(jié)更詳細(xì)地介紹了如何使用 Spring Boot,它涵蓋了諸如構(gòu)建系統(tǒng)、自動配置以及如何運(yùn)行應(yīng)用程序等主題,我們還介紹了一些 Spring Boot 最佳實(shí)踐,需要的朋友可以參考下
    2023-09-09
  • JAVA多線程線程安全性基礎(chǔ)

    JAVA多線程線程安全性基礎(chǔ)

    這篇文章主要介紹了如何測試Java類的線程安全性,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-08-08
  • 詳解spring cloud eureka注冊中心

    詳解spring cloud eureka注冊中心

    這篇文章主要介紹了詳解spring cloud eureka注冊中心,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Spring實(shí)戰(zhàn)之使用c:命名空間簡化配置操作示例

    Spring實(shí)戰(zhàn)之使用c:命名空間簡化配置操作示例

    這篇文章主要介紹了Spring實(shí)戰(zhàn)之使用c:命名空間簡化配置操作,結(jié)合實(shí)例形式詳細(xì)分析了Spring使用c:命名空間簡化配置的相關(guān)接口與配置操作技巧,需要的朋友可以參考下
    2019-12-12
  • SpringBoot讀取yml文件中配置數(shù)組的2種方法

    SpringBoot讀取yml文件中配置數(shù)組的2種方法

    這篇文章主要介紹了SpringBoot讀取yml文件中配置數(shù)組的2種方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringCloud整合Netty集群實(shí)現(xiàn)WebSocket的示例代碼

    SpringCloud整合Netty集群實(shí)現(xiàn)WebSocket的示例代碼

    文章主要介紹了SpringCloud整合Netty集群實(shí)現(xiàn)WebSocket的相關(guān)內(nèi)容,包括服務(wù)注冊和發(fā)現(xiàn)中心的配置,如使用Nacos、CommandLineRunner啟動Netty服務(wù)等,還介紹了通過Redis實(shí)現(xiàn)消息發(fā)布訂閱的機(jī)制,需要的朋友可以參考下
    2024-11-11
  • Spring?@Conditional注解示例詳細(xì)講解

    Spring?@Conditional注解示例詳細(xì)講解

    @Conditional是Spring4新提供的注解,它的作用是按照一定的條件進(jìn)行判斷,滿足條件給容器注冊bean,這篇文章主要介紹了Spring?@Conditional注解示例詳細(xì)講解,需要的朋友可以參考下
    2022-11-11
  • java如何分布式鎖實(shí)現(xiàn)和選型

    java如何分布式鎖實(shí)現(xiàn)和選型

    文章介紹了分布式鎖的重要性以及在分布式系統(tǒng)中常見的問題和需求,它詳細(xì)闡述了如何使用分布式鎖來確保數(shù)據(jù)的一致性和系統(tǒng)的高可用性,文章還提供了基于數(shù)據(jù)庫、Redis和Zookeeper的分布式鎖實(shí)現(xiàn)示例,分析了每種方法的優(yōu)點(diǎn)和缺點(diǎn)
    2025-01-01
  • MybatisPlus 主鍵策略的幾種實(shí)現(xiàn)方法

    MybatisPlus 主鍵策略的幾種實(shí)現(xiàn)方法

    MybatisPlus-Plus支持多種主鍵生成策略,可以通過@TableId注解的type屬性配置,主要策略包括AUTO、INPUT、ASSING_ID、ASSING_UUID和NONE,每種策略適用于不同的場景,下面就來介紹一下
    2024-10-10

最新評論

中阳县| 古丈县| 冕宁县| 浙江省| 广西| 蚌埠市| 蓬溪县| 田林县| 南昌县| 米脂县| 广元市| 陆河县| 楚雄市| 沙坪坝区| 朝阳市| 荥阳市| 定南县| 太康县| 那曲县| 曲水县| 北碚区| 寿宁县| 龙泉市| 延庆县| 蓝田县| 西昌市| 苏州市| 阿尔山市| 新绛县| 马关县| 招远市| 石楼县| 韶关市| 宿州市| 玉门市| 色达县| 读书| 乡城县| 霸州市| 会泽县| 徐汇区|