Sealyu

--- 博客已迁移至: http://www.sealyu.com/blog

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  618 随笔 :: 87 文章 :: 225 评论 :: 0 Trackbacks

最近在学习SWT/JFace,在做一个小东西的时候需要模拟鼠标键盘事件,在网上搜了一下,在java中模拟这些事件,主要有两种方法:

一、使用AWT中的Robot类

Robot

java.lang.Object
继承者 java.awt.Robot

public class Robot
extends Object
此类用于为测试自动化、自运行演示程序和其他需要控制鼠标和键盘的应用程序生成本机系统输入事件。Robot 的主要目的是便于 Java 平台实现自动测试。类中几个主要的模拟函数如下:
void keyPress(int keycode)
          按下给定的键。
 void keyRelease(int keycode)
          释放给定的键。
 void mouseMove(int x, int y)
          将鼠标指针移动到给定屏幕坐标。
 void mousePress(int buttons)
          按下一个或多个鼠标按钮。
 void mouseRelease(int buttons)
          释放一个或多个鼠标按钮。
 void mouseWheel(int wheelAmt)
          在配有滚轮的鼠标上旋转滚轮。
二、使用SWT中的鼠标键盘事件
    在SWT的snippets中有两个例子用来介绍这两个方法的使用,如下:

(1)、模拟鼠标事件
 * UI Automation (for testing tools) snippet: post mouse events
import org.eclipse.swt.*;
public class Snippet142 {
public static void main(String[] args) {
 final Display display = new Display();
 final Shell shell = new Shell(display);
 final Button button = new Button(shell,SWT.NONE);
 button.setSize(100,100);
 button.setText("Click");
 shell.pack();
 shell.open();
 button.addListener(SWT.MouseDown, new Listener() {
  public void handleEvent(Event e){
   System.out.println("Mouse Down (button: " + e.button + " x: " + e.x + " y: " + e.y + ")");
  }
 });
 final Point pt = display.map(shell, null, 50, 50);
 new Thread(){
  Event event;
  public void run(){
   try {
    Thread.sleep(300);
   } catch (InterruptedException e) {}
   event = new Event();
   event.type = SWT.MouseMove;
   event.x = pt.x;
   event.y = pt.y;
   display.post(event);
   try {
    Thread.sleep(300);
   } catch (InterruptedException e) {}
   event.type = SWT.MouseDown;
   event.button = 1;
   display.post(event);
   try {
    Thread.sleep(300);
   } catch (InterruptedException e) {}
   event.type = SWT.MouseUp;
   display.post(event);
  } 
 }.start();
 while (!shell.isDisposed()) {
  if (!display.readAndDispatch()) display.sleep();
 }
 display.dispose();
}
}
(2)、模拟键盘事件

 * UI Automation (for testing tools) snippet: post key events
import org.eclipse.swt.*;
public class Snippet146 {
public static void main(String[] args) {
 final Display display = new Display();
 final Shell shell = new Shell(display);
 final Text text = new Text(shell, SWT.BORDER);
 text.setSize(text.computeSize(150, SWT.DEFAULT));
 shell.pack();
 shell.open();
 new Thread(){
  public void run(){
   String string = "Love the method.";
   for (int i = 0; i < string.length(); i++) {
    char ch = string.charAt(i);
    boolean shift = Character.isUpperCase(ch);
    ch = Character.toLowerCase(ch);
    if (shift) {
     Event event = new Event();
     event.type = SWT.KeyDown;
     event.keyCode = SWT.SHIFT;
     display.post(event); 
    }
    Event event = new Event();
    event.type = SWT.KeyDown;
    event.character = ch;
    display.post(event);
    try {
     Thread.sleep(10);
    } catch (InterruptedException e) {}
    event.type = SWT.KeyUp;
    display.post(event);
    try {
     Thread.sleep(100);
    } catch (InterruptedException e) {}
    if (shift) {
     event = new Event();
     event.type = SWT.KeyUp;
     event.keyCode = SWT.SHIFT;
     display.post(event); 
    }
   }
  } 
 }.start();
 while (!shell.isDisposed()) {
  if (!display.readAndDispatch()) display.sleep();
 }
 display.dispose();
}
}
两种方法中都是先声明一个Event,然后将该Event的type类型设置为对应的 SWT.KeyUp/KeyDown/MouseUp/MouseDown,最后通过Display类的post(Event)方法来模拟对应的事件。注 意:如果有多个控件,需要得到对应控件的display属性,然后post该事件。例如,在一个窗口中有一个Browser,则需要使用 thisClass.browser.getDisplay().post(event)。

posted on 2008-04-10 22:42 seal 阅读(1064) 评论(0)  编辑  收藏 所属分类: Eclipse SWT/JFace RCP

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


网站导航: