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



好了,效果就是這樣了,雖然實(shí)現(xiàn)了基本功能,但是還是不完美,比如說(shuō)好友面板不能隨著窗口改變大小而改變,不過(guò)應(yīng)該已經(jīng)可以解決了,只是還沒(méi)實(shí)踐,下面就發(fā)上源代碼:
一共有三個(gè)類(lèi):
MemberModel.java //顯示類(lèi)QQ似好友標(biāo)簽信息的模板類(lèi);
TestPane.java //添加多個(gè)模板的容器類(lèi);
TestFrame.java //窗體類(lèi);
核心部分是前面兩個(gè)類(lèi),注意,第二個(gè)類(lèi)的布局方式不能為空,否則不能是容器顯示滾動(dòng)條,這是實(shí)現(xiàn)這個(gè)面板功能的一個(gè)難題,因?yàn)槲也辉趺磿?huì)使用其他的布局方式,就只經(jīng)常用空布局,經(jīng)過(guò)這次才知道,光用空布局是不行的,空布局的應(yīng)用受到了太多的限制。
在TestPane.java中添加好友信息的方式應(yīng)該是代碼添加黑名單信息的方式,可在其他類(lèi)中調(diào)用方法,傳遞參數(shù)(數(shù)組)過(guò)來(lái),然后對(duì)信息模板進(jìn)行初始化,還有面板上的信息模板從程序剛開(kāi)始運(yùn)行就生成了,只是設(shè)置了不可見(jiàn),后點(diǎn)擊相關(guān)分類(lèi)標(biāo)簽后的可視與不可視是同理的,也就是說(shuō)你有多少個(gè)好友就一直會(huì)有多少個(gè)JLabel存在你的面板上,只是你可能看不見(jiàn)他們,我感覺(jué)自己的實(shí)現(xiàn)方式不是很好。還有在我所用的這種布局方式中,顯示Label的寬度是一定的,我不知道怎么設(shè)置他的寬度和高度,所以通過(guò)在Label上添加了一個(gè)白色圖標(biāo)(185 X 60)來(lái)使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;//顯示昵稱(chēng);
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),這種最簡(jiǎn)單)
this.nickname = nickname;//昵稱(chēng);
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)的距離不是生與死,而是我站在你面前你卻不知道我愛(ài)你!");
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添加滾動(dòng)條;
if(scrollPane==null){
scrollPane=new JScrollPane(new TestPane());
//scrollPane.setBounds(20,5, -1, 600);
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER );//不顯示水平滾動(dòng)條;
}
return scrollPane;
}
private JPanel getJContentPane() {//實(shí)例化底層的容器JPanel;
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getScrollPane(), BorderLayout.CENTER);
}
return jContentPane;
}
}
能成功編譯成功我的源代碼的方略:
①、建一個(gè)項(xiàng)目,按我的類(lèi)名建3個(gè)類(lèi),將源代碼拷貝進(jìn)去;
②、在項(xiàng)目根目錄下建一個(gè)名為img的文件夾,將要用到的圖片放進(jìn)去。(相關(guān)圖片不再上傳了,自己隨便找?guī)讉€(gè)圖片測(cè)試即可)
③、編譯實(shí)現(xiàn);
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java遞歸如何正確輸出樹(shù)形菜單
- Java創(chuàng)建樹(shù)形結(jié)構(gòu)算法實(shí)例代碼
- java、js中實(shí)現(xiàn)無(wú)限層級(jí)的樹(shù)形結(jié)構(gòu)方法(類(lèi)似遞歸)
- Java遞歸遍歷樹(shù)形結(jié)構(gòu)的實(shí)現(xiàn)代碼
- JSON復(fù)雜數(shù)據(jù)處理之Json樹(shù)形結(jié)構(gòu)數(shù)據(jù)轉(zhuǎn)Java對(duì)象并存儲(chǔ)到數(shù)據(jù)庫(kù)的實(shí)現(xiàn)
- Java樹(shù)形菜單的創(chuàng)建
- Java遍歷輸出指定目錄、樹(shù)形結(jié)構(gòu)所有文件包括子目錄下的文件
- Java easyui樹(shù)形表格TreeGrid的實(shí)現(xiàn)代碼
相關(guān)文章
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)語(yǔ)句等相關(guān)概念、原理、使用技巧與操作注意事項(xiàng),需要的朋友可以參考下2020-02-02
JAVA多線(xiàn)程線(xiàn)程安全性基礎(chǔ)
這篇文章主要介紹了如何測(cè)試Java類(lèi)的線(xiàn)程安全性,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-08-08
Spring實(shí)戰(zhàn)之使用c:命名空間簡(jiǎn)化配置操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之使用c:命名空間簡(jiǎn)化配置操作,結(jié)合實(shí)例形式詳細(xì)分析了Spring使用c:命名空間簡(jiǎn)化配置的相關(guān)接口與配置操作技巧,需要的朋友可以參考下2019-12-12
SpringBoot讀取yml文件中配置數(shù)組的2種方法
這篇文章主要介紹了SpringBoot讀取yml文件中配置數(shù)組的2種方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringCloud整合Netty集群實(shí)現(xiàn)WebSocket的示例代碼
文章主要介紹了SpringCloud整合Netty集群實(shí)現(xiàn)WebSocket的相關(guān)內(nèi)容,包括服務(wù)注冊(cè)和發(fā)現(xiàn)中心的配置,如使用Nacos、CommandLineRunner啟動(dòng)Netty服務(wù)等,還介紹了通過(guò)Redis實(shí)現(xiàn)消息發(fā)布訂閱的機(jī)制,需要的朋友可以參考下2024-11-11
Spring?@Conditional注解示例詳細(xì)講解
@Conditional是Spring4新提供的注解,它的作用是按照一定的條件進(jìn)行判斷,滿(mǎn)足條件給容器注冊(cè)bean,這篇文章主要介紹了Spring?@Conditional注解示例詳細(xì)講解,需要的朋友可以參考下2022-11-11
MybatisPlus 主鍵策略的幾種實(shí)現(xiàn)方法
MybatisPlus-Plus支持多種主鍵生成策略,可以通過(guò)@TableId注解的type屬性配置,主要策略包括AUTO、INPUT、ASSING_ID、ASSING_UUID和NONE,每種策略適用于不同的場(chǎng)景,下面就來(lái)介紹一下2024-10-10

