好好生活,努力工作,天天向上!

BlogJava 首页 新随笔 联系 聚合 管理
  46 Posts :: 1 Stories :: 178 Comments :: 0 Trackbacks

   最近在实现一个图片压缩的功能,想在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, 5050);
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);
  
  这样就基本上模拟出了系统鼠标的动作了。大家有兴趣可以研究一下,比如用它来做点坏事情,呵呵
posted on 2009-06-01 11:15 VWPOLO 阅读(1902) 评论(3)  编辑  收藏 所属分类: SWT JFace

Feedback

# re: 使用Display的Post方法控制键盘 2009-06-01 13:57 无量字幕
呵呵,有意思  回复  更多评论
  

# re: 使用Display的Post方法控制键盘 2009-06-01 22:55 俊星
第二段代码有点问题:
14 final Point pt = display.map(shell, null, 100, 50);
换成
14 final Point pt = display.map(shell, null, 50, 50);
才能看到控制台输出的鼠标响应事件。
  回复  更多评论
  

# re: 使用Display的Post方法控制键盘 2009-06-02 09:08 VWPOLO
@俊星
谢谢提醒,已经修正了  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: