以前在网上瞎转悠的时候就发现很多人为用Java实现QQ登陆后的面板的问题感到十分头疼,最近我因在写模拟QQ的项目,故不可或缺的遇到了这一个问题,在网上我google了,百度了,最终发现的是有很多人被这一问题困扰,却没有解决的方案,估计是那些写出来了的人,没有发布到网上来,如今,经过自己的多方面查找资料,终于把他写出来了,也不枉昨晚熬夜了,呵呵,好了先让我们来看看实现的效果截图:
好了,效果就是这样了,虽然实现了基本功能,但是还是不完美,比如说好友面板不能随着窗口改变大小而改变,不过应该已经可以解决了,只是还没实践,下面就发上源代码:
一共有三个类:
MemberModel.java //显示类QQ似好友标签信息的模板类;
TestPane.java //添加多个模板的容器类;
TestFrame.java //窗体类;
核心部分是前面两个类,注意,第二个类的布局方式不能为空,否则不能是容器显示滚动条,这是实现这个面板功能的一个难题,因为我不怎么会使用其他的布局方式,就只经常用空布局,经过这次才知道,光用空布局是不行的,空布局的应用受到了太多的限制。
在TestPane.java中添加好友信息的方式应该是代码添加黑名单信息的方式,可在其他类中调用方法,传递参数(数组)过来,然后对信息模板进行初始化,还有面板上的信息模板从程序刚开始运行就生成了,只是设置了不可见,后点击相关分类标签后的可视与不可视是同理的,也就是说你有多少个好友就一直会有多少个JLabel存在你的面板上,只是你可能看不见他们,我感觉自己的实现方式不是很好。还有在我所用的这种布局方式中,显示Label的宽度是一定的,我不知道怎么设置他的宽度和高度,所以通过在Label上添加了一个白色图标(185 X 60)来使Label变宽,然后再添加模板JPanel,如果网友们还有好的解决方法,希望不吝赐教。
下面是源码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
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 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; } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
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 ); } } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
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的文件夹,将要用到的图片放进去。(相关图片不再上传了,自己随便找几个图片测试即可)
③、编译实现;
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。