相信大家都使用過MSN,QQ這樣的即時聊天類軟件,對于它們的好友上線提示功能并不陌生吧?從屏幕右下角彈出一個小界面,慢慢上升,最后消失。我們能不能在自已的程序中也做出相同的功能呢?能!筆者現用JAVA和eclipse的SWT用戶界面組件實現這個功能。
什么是SWT呢? SWT原來是eclipse項目組為開發eclipse IDE所編寫的圖形界面API,運行時,其先判斷本機是否有相同的界面元素,如果有則直接調用顯示,如沒有才進行模擬顯示。其運行機制使速度比AWT,SWING快很多。
了解更多請看:http://www.eclipse.org/swt
編寫思路
先取得用戶屏幕大小,用屏幕高度減去popup界面的高度計算出popup界面在屏幕顯示的最高位置(當界面移動到此位置時就停止移動)。
Rectangle area = Display.getDefault().getClientArea(); int upPosition = area.height - 100; |
用屏幕高度加上popup界面的高度就計算出popup界面的初始位置(初始化時不可見,然后慢慢上移到upPosition點后停止移動,再顯示若干秒后消失)。
int downPosition = area.height + 100; |
移動位置我們用線程實現,當初始化界面后,調用start()方法運行此線程,在線程中循環判斷downPosition的大小是否小于upPosition,如果小于的話說明還未到停止的時候,設置popup界面的邊框為downPosition,并暫停10毫秒,如果downPosition大于upPosition的,說明popup界面已移動到了最高位置。調用sleep()暫停5秒鐘后關閉界面并退出程序。就這么簡單,ok, Let's go! 下面給出整個程序代碼:
這是運行后的效果

?
在這之前要像我下面一樣把swt包導進來!
?
//?Test.java

import?org.eclipse.swt.SWT;
import?org.eclipse.swt.events.SelectionAdapter;
import?org.eclipse.swt.events.SelectionEvent;
import?org.eclipse.swt.widgets.Button;
import?org.eclipse.swt.widgets.Display;
import?org.eclipse.swt.widgets.Shell;


public?class?Test?
{


?public?static?void?main(String[]?args)?
{
??
??final?Display?display?=?new?Display();
??Shell?shell?=?new?Shell();
??shell.setText("aaa");
??shell.setSize(250,?150);
??
??final?Button?button?=?new?Button(shell,?SWT.NONE);
??button.setBounds(50,?20,?100,?25);
??button.setText("button");??

??button.addSelectionListener(new?SelectionAdapter()?
{

???public?void?widgetSelected(SelectionEvent?e)?
{
????System.out.println("click");
????Popup?popup?=?new?Popup("您的好友xxx上線了。");
????popup.start();
???}
??});
??
??shell.open();
????

??while?(!shell.isDisposed())?
{

???if?(!display.readAndDispatch())?
{
????display.sleep();
???}
??}
??display.dispose();
?}
}


//Popup.java

import?org.eclipse.swt.SWT;
import?org.eclipse.swt.graphics.Rectangle;
import?org.eclipse.swt.widgets.Display;
import?org.eclipse.swt.widgets.Shell;
import?org.eclipse.swt.widgets.Text;


public?class?Popup?extends?Thread?
{

?Shell?shell;

?protected?int?moveStep?=?2;
?protected?int?upPosition;
?protected?int?downPosition;
?protected?int?leftPosition;


?public?Popup(final?String?message)?
{

??shell?=?new?Shell(SWT.ON_TOP);
??Text?text?=?new?Text(shell,?SWT.MULTI?|?SWT.WRAP);
??text.setBounds(10,?20,?180,?80);
??text.setBackground(shell.getBackground());??
??text.setText(message);
??Rectangle?area?=?Display.getDefault().getClientArea();

??upPosition?=?area.height?-?100;
??downPosition?=?area.height?+?100;
??leftPosition?=?area.width?-?180;

??shell.setSize(180,?100);
??shell.setLocation(leftPosition,?downPosition);

??shell.open();

?}


?public?void?run()?
{

??Display?display?=?shell.getDisplay();

??while?(true)?
{

???try?
{
????Thread.sleep(10);

????if?((downPosition?-?moveStep)?>?upPosition)?
{

?????display.asyncExec(new?Runnable()?
{

??????public?void?run()?
{
???????shell.setLocation(
????????leftPosition,
????????downPosition?-?moveStep);
???????downPosition?-=?moveStep;
??????}
?????});

????}?else?
{
?????Thread.sleep(5000);

?????display.asyncExec(new?Runnable()?
{

??????public?void?run()?
{
???????shell.dispose();
??????}
?????});
????}

???}?catch?(InterruptedException?e)?
{
????e.printStackTrace();
???}
??}
?}
}
posted on 2007-02-05 23:05
EricWong 閱讀(495)
評論(0) 編輯 收藏 所屬分類:
Java