最近在實現一個圖片壓縮的功能,想在Eclipse.org上看有沒有辦法能夠通過SWT的API能 夠改變圖片的分辨率,Eclipse.org上面提供了好些SWT的例子,發現了Display的post方法挺 有趣的,以前沒有注意到,現在趕快把它記錄下來,post方法的參數為Event,通過制定這個 Events的屬性,可以控制系統的鍵盤事件,比如保持shift鍵一直按著。下面是代碼:
1 import org.eclipse.swt.*;
2 import org.eclipse.swt.widgets.*;
3
4 /**
5 * 觸發系統的鍵盤事件。
6 * @author vwpolo
7 * <p>2009-6-1</p>
8 */
9 public class Snippet146 {
10
11 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);
這樣就基本上模擬出了系統鼠標的動作了。大家有興趣可以研究一下,比如用它來做點壞 事情,呵呵