首页 新闻 安徽 体育 财经 黄梅 旅游 军事 娱乐 法治 教育 伊人 健康
繁体中文
 IT 彩信 读书 汽车 演艺 音乐 徽商 书库 邮件 论坛 贺卡 相册 交友
简体中文
精彩图库 业界动态 观察分析 手机数码 电脑教室 软件下载 游戏人间 本地市场
精彩推荐
v戴尔发布超低价笔记本 5999元冲击市场
v盛大购新浪股票 陈天桥谈盛大帝国开局战
v联想收购IBM PC业务通过美国政府批准
v好莱坞巨头来华接洽 EVD有望获千部影片发行权
v民建中央质疑电信收费 呼吁取消固话月租费
v专为巾帼准备 职业商场女性手机精选导购
v有多少机可以重来 2004年遗憾机型回顾
v肯定能让人绝倒的《三国无双》武将图
v《帝国时代3》GDC精美游戏画面全剖析
精彩图片
  您当前的位置 :IT地带 > 电脑教室 > 程序设计 正文
Java实现类MSN、QQ好友上线通知界面

中安网  2005-03-25 15:26

  天极yesky3月23日报道 相信大家都使用过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!下面给出整个程序代码:

  描述:

  (Test为主界面,点击上面的button后,调用Popup在右下角显示像MSN和QQ一样的popup界面。)

  图一为源代码中的实现,图二为修改过后的界面(和QQ的有点像吧。)

图一
图二

  源代码:

  // Test.java

  //主界面,其中只有一个button,当点击时调用Popup在右下角显示像MSN和QQ一样的popup界面。

  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的事件,当用户点击时调用Popup类显示popup界面。button.addSelectionListener(new SelectionAdapter() {public void widgetSelected(SelectionEvent e) {//实例化popup类,构造函数为popup界面中出现的提示信息。Popup popup = new Popup("您的好友xxx上线了。");popup.start();}});

  shell.open();

  while (!shell.isDisposed()) {if (!display.readAndDispatch()) {display.sleep();}}display.dispose();}}

  // Popup.java

  //实现像MSN,QQ一样的好友上线通知popup

  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; //每次移动的pixelprotected int upPosition; //能移动到的最上面坐标protected int downPosition; //当前popup的边框坐标protected int leftPosition; //popup左边边框坐标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;//计算出popup界面在屏幕显示的最高位置downPosition = area.height + 100;//计算出popup界面的初始位置leftPosition = area.width - 180;

  shell.setSize(180, 100);

  //初始化popup位置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;}});//此时已经移动到了最高位置,显示5秒钟后,关闭窗口并退出。} else {Thread.sleep(5000);display.asyncExec(new Runnable() {public void run() {shell.dispose();}});}} catch (InterruptedException e) {e.printStackTrace();}}}

  }

  上面的源程序就完成了图一中的功能,读者可以自行修改,让其界面,功能更强大。(文/何旭中)

编辑: 丁毅
 ∷【相 关 报 道】∷
-实战Java多线程编程精要之限制优先级   05-02-05 14:30
-实战体会Java多线程编程精要之基础知识   05-01-17 13:56
-JavaBean实现多文件上传的两种方法   05-01-13 13:36
-深入浅出基于Java的解释器设计模式   05-01-10 14:19
-网络通讯更自由 谈Java串行端口技术协议   04-12-29 12:40
 

中国安徽在线网站(中安在线)版权所有 未经允许 请勿复制或镜像
皖ICP证 030106号