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

一、使用AWT中的Robot类</h4>

Robot


此类用于为测试自动化、自运行演示程序和其他需要控制鼠标和键盘的应用程序生成本机系统输入事件。Robot 的主要目的是便于 Java 平台实现自动测试。类中几个主要的模拟函数如下:</h5>

void <strong><a href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/awt/Robot.html#keyPress%28int%29">keyPress</a></strong>(int keycode)
按下给定的键。</td>
void <strong><a href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/awt/Robot.html#keyRelease%28int%29">keyRelease</a></strong>(int keycode)
释放给定的键。</td>
void <strong><a href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/awt/Robot.html#mouseMove%28int,%20int%29">mouseMove</a></strong>(int x, int y)
将鼠标指针移动到给定屏幕坐标。</td>
void <strong><a href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/awt/Robot.html#mousePress%28int%29">mousePress</a></strong>(int buttons)
按下一个或多个鼠标按钮。</td>
void <strong><a href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/awt/Robot.html#mouseRelease%28int%29">mouseRelease</a></strong>(int buttons)
释放一个或多个鼠标按钮。</td>
void <strong><a href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/awt/Robot.html#mouseWheel%28int%29">mouseWheel</a></strong>(int wheelAmt)
在配有滚轮的鼠标上旋转滚轮。</td>
二、使用SWT中的鼠标键盘事件

在SWT的snippets中有两个例子用来介绍这两个方法的使用,如下:
(1)、模拟鼠标事件<br />
* 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)、模拟键盘事件</div>

* 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)。</div>

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注