24 2009

SWTException: Subclassing not allowed

由于设计了一个类继承Shell,导致出现了“SWTException: Subclassing not allowed”错误。搜索了一下才知道, Shell 是可以被继承的,但 Shell 的父类 Decorations 有一个 checkSubclass () 函数,当其子类不符合此方法的检查规则时,就会抛出异常。因此不是简单继承 Shell 就行了的,还要做一些比较复杂的工作。

因此我们有三种方式可以解决这类异常:

  1. 聚合优于继承,采用聚合方式解决,也符合面向对象的设计原则
  2. 重写 checkSubclass ()方法,去掉基类的验证检查
  3. 加上“package org.eclipse.swt.widgets”,让被扩展的类与扩展类处于同一类层次

23 2009

SWT窗体关闭时显示确认对话框

关闭窗体shell 时显示确认对话框:

1
2
3
4
5
6
7
8
9
		shell.addShellListener(new ShellAdapter() {
	        public void shellClosed(ShellEvent e) {
	            MessageBox mb = new MessageBox(shell, SWT.ICON_QUESTION | SWT.OK | SWT.CANCEL);
	            mb.setText("Confirm Exit");
	            mb.setMessage("Are you sure you want to exit?");
	            int rc = mb.open();
	            e.doit = (rc == SWT.OK);
	        }
	});

11 2009

利用SWT创建系统托盘

关键代码如下:

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
		Display display=Display.getDefault();
		Tray tray=display.getSystemTray();
 
		if(tray==null)
		{
			System.out.println("该系统不支持系统托盘!");
			return;
		}
 
		final TrayItem item=new TrayItem(tray,SWT.NONE);
 
		//将图片一起打包时,用此方法获取图片,this.getClass().getResourceAsStream().
		Image img=new Image(display,this.getClass().getResourceAsStream("fav.ico"));
		item.setImage(img);
 
		item.setToolTipText("系统托盘测试");//托盘文字提示
 
		//添加监听,鼠标右键退出
		item.addListener(SWT.MenuDetect, new Listener(){
 
			@Override
			public void handleEvent(Event event) {
				if(event.type==SWT.MenuDetect)
					item.dispose();
			}
 
		});
 
		while (!item.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();

item.addListener( SWT.Show, listner ); //系统托盘显示
item.addListener( SWT.Hide , listner );//系统托盘隐藏
item.addListener( SWT.Selection , listner );//系统托盘单击选中
item.addListener( SWT.DefaultSelection , listner );//系统托盘双击选中
item.addListener( SWT.MenuDetect , listner );//系统托盘右击事件


10 2009

小巧的mp3播放器YYplayer(jmf实现)

以前一直用PlayYO作为mp3播放器,但是比较不爽的是PlayYO总是从当前文件夹下的第一首歌开始顺序播放,前面的歌曲都听烦了,后面的歌曲却很少能听到。本来想找到PlayYO源代码,修改一下,让它能够实现随机播放,找了半天也没有找到源码,最后决定自己模仿PlayYO编写一个mp3播放器。经过的2天努力,终于实现了个雏形。

界面是用SWT实现的,音频播放用JMF实现,也正是因为这个原因,导致最后生成的文件有点大(5.25 MB),与PlayYO(11KB)比起来有着天壤之别。

使用方式:

将YYplayer放到存有mp3歌曲的文件夹下,双击运行,YYplayer就会随机播放此文件下的mp3歌曲了。

单击 – 暂停/开始
右击 – 退出

YYplayer下载:yyplayer


16 2008

SWT线程管理

UI对象由Display对象负责管理,是SWT程序运行的核心。如果在非UI线程中调用界面上的控件对象是会在运行期间报错,所以Display对象使用asyncExec(Runnable runnable)和sysncExec(Runnable runnable)更新界面上的控件对象。


10 2008

在Eclipse中配置SWT

只需要在项目属性Add External JARs处添加 org.eclipse.swt.win32.win32.x86_3.4.0.v3448f.jar,随着eclipse版本的变化SWT JAR包的名称可能也会有相应变化,现在使用的eclipse版本是3.4.0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import org.eclipse.swt.widgets.*;
 
public class Test {
 
	public static void main(String[] args) {
		Display display = new Display();
		Shell shell = new Shell(display);
		shell.setText("www.hijava.org");
		shell.setSize(500, 400);
		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();
	}
 
}