最近在实现一个图片压缩的功能,想在Eclipse.org上看有没有办法能够通过SWT的API能 够改变图片的分辨率,Eclipse.org上面提供了好些SWT的例子,发现了Display的post方法挺 有趣的,以前没有注意到,现在赶快把它记录下来,post方法的参数为Event,通过制定这个 Events的属性,可以控制系统的键盘事件,比如保持shift键一直按着。下面是代码:
1 import org.eclipse.swt.*;2 import org.eclipse.swt.widgets.*;34 /**5 * 触发系统的键盘事件。6 * @author vwpolo7 *
2009-6-1
8 */9 public class Snippet146 {1011 public static void main(String[] args) {12 final Display display = new Display();13 final Shell shell = new Shell(display);14 final Text text = new Text(shell, SWT.BORDER);15 text.setSize(text.computeSize (150, SWT.DEFAULT));16 shell.pack();17 shell.open ();18 new Thread(){19 public void run() {20 String string = "Love the method.";21 for (int i = 0; i < string.length(); i++) {22 char ch = string.charAt(i);23 boolean shift = Character.isUpperCase(ch);24 ch = Character.toLowerCase(ch);25 if (shift) {26 Event event = new Event();27 event.type = SWT.KeyDown;28 event.keyCode = SWT.SHIFT;29 display.post(event);30 }31 Event event = new Event();32 event.type = SWT.KeyDown;33 event.character = ch;34 display.post (event);35 try {36 Thread.sleep(10);37 } catch (InterruptedException e) {}38 event.type = SWT.KeyUp;39 display.post (event);40 try {41 Thread.sleep(100);42 } catch (InterruptedException e) {}43 if (shift) {44 event = new Event ();45 event.type = SWT.KeyUp;46 event.keyCode = SWT.SHIFT;47 display.post (event);48 }49 }50 } 51 }.start();52 while (!shell.isDisposed()) {53 if (!display.readAndDispatch ()) display.sleep();54 }55 display.dispose();56 }57 }
上面的例子功能是演示在一个文本框中模拟用户输入一段字符串,字符串的内容是”Love the method.”,还可以通过这个来移动鼠标的箭头,像下面这样:
1 public static void main(String[] args) {2 final Display display = new Display();3 final Shell shell = new Shell(display);4 final Button button = new Button (shell,SWT.NONE);5 button.setSize(100,100);6 button.setText("Click");7 shell.pack();8 shell.open ();9 button.addListener(SWT.MouseDown, new Listener() {10 public void handleEvent(Event e){11 System.out.println("Mouse Down (button: " + e.button + " x: " + e.x + " y: " + e.y + ")");12 }13 });14 final Point pt = display.map(shell, null, 50, 50);15 new Thread(){16 Event event;17 public void run(){18 try {19 Thread.sleep(300);20 } catch (InterruptedException e) {}21 event = new Event();22 event.type = SWT.MouseMove;23 event.x = pt.x;24 event.y = pt.y;25 display.post(event);26 try {27 Thread.sleep(300);28 } catch (InterruptedException e) {}29 event.type = SWT.MouseDown;30 event.button = 1;31 display.post(event);32 try {33 Thread.sleep (300);34 } catch (InterruptedException e) {} 35 event.type = SWT.MouseUp;36 display.post(event);37 } 38 }.start();39 while (!shell.isDisposed()) {40 if (!display.readAndDispatch()) display.sleep();41 }42 display.dispose();43 }
首先创建一个100*100大小的按钮,然后通过display.map(shell, null, 50, 50);这 段代码获得指定shell上的相对坐标,这里是指shell的相对坐标上的x=50,y=50,然后再换算 成显示屏幕系统的绝对坐标,设置事件类型为鼠标移动,移动的目标坐标位置是刚才我们取 得的系统坐标
event = new Event();event.type = SWT.MouseMove;event.x = pt.x;event.y = pt.y;display.post(event);
在触发这个事件后,让它休眠0.3秒
try {Thread.sleep(300);} catch (InterruptedException e) {}
接着再将事件的类型设置为鼠标按下事件:
event.type = SWT.MouseDown;event.button = 1;display.post (event);
这样就基本上模拟出了系统鼠标的动作了。大家有兴趣可以研究一下,比如用它来做点坏 事情,呵呵
任何的限制,都是从自己的内心开始的。