您的位置:首页 > 其它

使用SWT模拟鼠标键盘事件

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

一、使用AWT中的Robot类

Robot

java.lang.Object
java.awt.Robot


publicclassRobotextendsObject



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

void
keyPress(intkeycode)

按下给定的键。
void
keyRelease(intkeycode)

释放给定的键。
void
mouseMove(intx,inty)

将鼠标指针移动到给定屏幕坐标。
void
mousePress(intbuttons)

按下一个或多个鼠标按钮。
void
mouseRelease(intbuttons)

释放一个或多个鼠标按钮。
void
mouseWheel(intwheelAmt)

在配有滚轮的鼠标上旋转滚轮。
二、使用SWT中的鼠标键盘事件
在SWT的snippets中有两个例子用来介绍这两个方法的使用,如下:

(1)、模拟鼠标事件
*UIAutomation(fortestingtools)snippet:postmouseevents
importorg.eclipse.swt.*;
publicclassSnippet142{
publicstaticvoidmain(String[]args){
finalDisplaydisplay=newDisplay();
finalShellshell=newShell(display);
finalButtonbutton=newButton(shell,SWT.NONE);
button.setSize(100,100);
button.setText("Click");
shell.pack();
shell.open();
button.addListener(SWT.MouseDown,newListener(){
publicvoidhandleEvent(Evente){
System.out.println("MouseDown(button:"+e.button+"x:"+e.x+"y:"+e.y+")");
}
});
finalPointpt=display.map(shell,null,50,50);
newThread(){
Eventevent;
publicvoidrun(){
try{
Thread.sleep(300);
}catch(InterruptedExceptione){}
event=newEvent();
event.type=SWT.MouseMove;
event.x=pt.x;
event.y=pt.y;
display.post(event);
try{
Thread.sleep(300);
}catch(InterruptedExceptione){}
event.type=SWT.MouseDown;
event.button=1;
display.post(event);
try{
Thread.sleep(300);
}catch(InterruptedExceptione){}
event.type=SWT.MouseUp;
display.post(event);
}
}.start();
while(!shell.isDisposed()){
if(!display.readAndDispatch())display.sleep();
}
display.dispose();
}
}
(2)、模拟键盘事件

*UIAutomation(fortestingtools)snippet:postkeyevents
importorg.eclipse.swt.*;
publicclassSnippet146{
publicstaticvoidmain(String[]args){
finalDisplaydisplay=newDisplay();
finalShellshell=newShell(display);
finalTexttext=newText(shell,SWT.BORDER);
text.setSize(text.computeSize(150,SWT.DEFAULT));
shell.pack();
shell.open();
newThread(){
publicvoidrun(){
Stringstring="Lovethemethod.";
for(inti=0;i<string.length();i++){
charch=string.charAt(i);
booleanshift=Character.isUpperCase(ch);
ch=Character.toLowerCase(ch);
if(shift){
Eventevent=newEvent();
event.type=SWT.KeyDown;
event.keyCode=SWT.SHIFT;
display.post(event);
}
Eventevent=newEvent();
event.type=SWT.KeyDown;
event.character=ch;
display.post(event);
try{
Thread.sleep(10);
}catch(InterruptedExceptione){}
event.type=SWT.KeyUp;
display.post(event);
try{
Thread.sleep(100);
}catch(InterruptedExceptione){}
if(shift){
event=newEvent();
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)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: