来源: 天极网
O)p-YgI2 ]KDxXV%V* 相信大家都使用过MSN,QQ这样的即时聊天类软件,对于它们的好友上线提示功能并不陌生吧?从屏幕右下角弹出一个小界面,慢慢上升,最后消失。我们能不能在自已的程序中也做出相同的功能呢?能!笔者现用JAVA和eclipse的SWT用户界面组件实现这个功能。
v^R\0<3] 13Vx[i;V 什么是SWT呢?
mj8&s=y ?Tq"{_0 R SWT原来是eclipse项目组为开发eclipse IDE所编写的图形界面API,运行时,其先判断本机是否有相同的界面元素,如果有则直接调用显示,如没有才进行模拟显示。其运行机制使速度比AWT,SWING快很多。
F;8dSd t4O8O1s J 了解更多请看:
http://www.eclipse.org/swt )Re.-; 8 hE2+^K* 编写思路
hN]?>tglJ u|7_9S 先取得用户屏幕大小,用屏幕高度减去popup界面的高度计算出popup界面在屏幕显示的最高位置(当界面移动到此位置时就停止移动)。
-- z`SB6> ghUu^u;} wH)NZ`S Rectangle area = Display.getDefault().getClientArea();
RA`{v.y int upPosition = area.height - 100;
uzVG#S* e5fqKS9s 用屏幕高度加上popup界面的高度就计算出popup界面的初始位置(初始化时不可见,然后慢慢上移到upPosition点后停止移动,再显示若干秒后消失)。
jRX K`h= e8R |7tw R4^Qi4D int downPosition = area.height + 100;
"(|hSS :C{Lj 移动位置我们用线程实现,当初始化界面后,调用start()方法运行此线程,在线程中循环判断downPosition的大小是否小于upPosition,如果小于的话说明还未到停止的时候,设置popup界面的边框为downPosition,并暂停10毫秒,如果downPosition大于upPosition的,说明popup界面已移动到了最高位置。调用sleep()暂停5秒钟后关闭界面并退出程序。就这么简单,ok, Let's go! 下面给出整个程序代码:
kge'A[f ?cM Jd 描述:
"5, 2bI/ P4cFIl~TP (Test为主界面,点击上面的button后,调用Popup在右下角显示像MSN和QQ一样的popup界面。)
`C`sci A"vRX`q7 图一为源代码中的实现,图二为修改过后的界面(和QQ的有点像吧。)
k=_?F3) 'H7SURF0 f *3UP 图一
U9b R = F [ ehpO;5* Ut< v 33 图二
Y~'7OXcy UE%Be5*5 [ {c,a=& 0->"Wv :3 源代码:
o G,"Jh &qBC81WQT // Test.java
IPJp~I0;F //主界面,其中只有一个button,当点击时调用Popup在右下角显示像MSN和QQ一样的popup界面。
wyMUl)=S e `=. ^i import org.eclipse.swt.SWT;
ZF}F2X_ import org.eclipse.swt.events.SelectionAdapter;
ej=A\ ry9 import org.eclipse.swt.events.SelectionEvent;
J!ABp| -^ import org.eclipse.swt.widgets.Button;
r!@& ?my^ import org.eclipse.swt.widgets.Display;
%#(tM~qeB import org.eclipse.swt.widgets.Shell;
`q#l3~9 [%o.7&I public class Test {
uEL7hs`]B &&(!v^"5 public static void main(String[] args) {
wEcvQ;Mb ' S&[{J final Display display = new Display();
$MWmg Shell shell = new Shell();
(ZQ59nLA shell.setText("aaa");
ALCKQHa} shell.setSize(250, 150);
tUSl Q+Ng <C_jB~) final Button button = new Button(shell, SWT.NONE);
qi'FfKF| button.setBounds(50, 20, 100, 25);
SJySF!nnu button.setText("button");
ZtzzQ-} P //监听button的事件,当用户点击时调用Popup类显示popup界面。
^Ip~Sgmy button.addSelectionListener(new SelectionAdapter() {
j,^(7 public void widgetSelected(SelectionEvent e) {
AstbO[t4T //实例化popup类,构造函数为popup界面中出现的提示信息。
Jqz Hx#2 Popup popup = new Popup("您的好友xxx上线了。");
Y+a.015pW popup.start();
p >/~hJ6 }
?OhJK^g });
MJ*>7@Ovwr Umd)(C#gO shell.open();
AU !ZKNl1 02N\ODe` while (!shell.isDisposed()) {
YjpYY[ if (!display.readAndDispatch()) {
5-2YT5 display.sleep();
w;p&>6&L3 }
gyM y\uH@ }
Isq/ 'n display.dispose();
Y@q?5e*nB }
;8_SB44 }
lJpB@& & _W\N // Popup.java
=< l|X J= //实现像MSN,QQ一样的好友上线通知popup
RtxXGwi QyYIK&p$ import org.eclipse.swt.SWT;
Cux3F^[X/ import org.eclipse.swt.graphics.Rectangle;
Q4Cq>T-) import org.eclipse.swt.widgets.Display;
un8RlxP% import org.eclipse.swt.widgets.Shell;
!LJ\zt76)F import org.eclipse.swt.widgets.Text;
o>*-?#-V MsQD:2G ) public class Popup extends Thread {
k4<;dv V=%ugO~FO Shell shell;
dn>G42c;) XQtgQF/rv protected int moveStep = 2; //每次移动的pixel
`vMfT d>~ protected int upPosition; //能移动到的最上面坐标
R_21;41 protected int downPosition; //当前popup的边框坐标
BXPq~e[!M protected int leftPosition; //popup左边边框坐标 public Popup(final String message) {
\NgEq[%T A W W_\D shell = new Shell(SWT.ON_TOP);
`Xg^.s Text text = new Text(shell, SWT.MULTI | SWT.WRAP);
Q]L=.u8P text.setBounds(10, 20, 180, 80);
5ktl| text.setBackground(shell.getBackground());
#^A H' text.setText(message);
w"Am24'% +5^x%b&u //取屏莫大小
M.^r bS Rectangle area = Display.getDefault().getClientArea();
m& ; 3!V. ymMVR$t upPosition = area.height - 100;//计算出popup界面在屏幕显示的最高位置
A lLv: downPosition = area.height + 100;//计算出popup界面的初始位置
5%5 '\2* leftPosition = area.width - 180;
-<T^p]&<y MZ.6Z+yA shell.setSize(180, 100);
pg#S (.& !*\>5H> //初始化popup位置
5 +`i.Bm shell.setLocation(leftPosition, downPosition);
{x3 m mx.S &0]~|6 hf shell.open();
}lP0 aJoW]5]P=i }
X^<'*;u nvol:CP'A public void run() {
t\!=EBy "jN! .9y5 Display display = shell.getDisplay();
!7>^9}x2 while (true) {
XyZ_Q3V try {
d=M8GNl(> Thread.sleep(10);
wlU .EF d-QY7v //判断当前位置是否小于能出现的最高位置,小于的话就说明还可以向上移动。
_csj!-_} if ((downPosition - moveStep) >upPosition) {
$CbJ];W display.asyncExec(new Runnable() {
ec{>Uu< public void run() {
mV*Ey shell.setLocation(leftPosition, downPosition- moveStep);
cNB" Vl downPosition -= moveStep;
"h"A<W }
Ud sT7"g });
l/t}|W //此时已经移动到了最高位置,显示5秒钟后,关闭窗口并退出。
7nImF } else {
,h>S:gz Thread.sleep(5000);
onB9XIAJL$ display.asyncExec(new Runnable() {
U+(2@:$ public void run() {
+>HuW" shell.dispose();
N@xzDO!>z }
.tpi?S });
k)&M]~?* }
m]$Q J| } catch (InterruptedException e) {
w/.8Myo{ e.printStackTrace();
bLj &6 }
$D rY6"= }
tx& i8 }
cO zxo{p }
1Gk'za ?]/(;,}! 上面的源程序就完成了图一中的功能,读者可以自行修改,让其界面,功能更强大。