正在阅读:用Java事件处理机制实现录制回放功能用Java事件处理机制实现录制回放功能

2005-08-25 10:02 出处: 作者:宋荆汉 责任编辑:moningfeng

  3.3 Java事件回放

  事件的回放其实比较简单了,比如我们现在记录的是frame1下的jButton1点击事件回放。看下面一段简单的程序,只要点一下jButton1,就在控制台打印一次"click me"的字符串。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Frame1 extends JFrame
{
private JButton jButton1
= new JButton();

public Frame1()
{
try {
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void
main(String[] args)
{
Frame1 frame1 = new Frame1();
frame1.setVisible(true) ;

}
private void jbInit()
throws Exception
{
jButton1.setText("jButton1");
jButton1.addActionListener
(new java.awt.event.ActionListener()
{
public void actionPerformed
(ActionEvent e)
{
jButton1_actionPerformed(e);
}
});
this.setTitle("Test");
this.getContentPane().add(jButton1,
BorderLayout.CENTER);
}

void jButton1_actionPerformed
(ActionEvent e)
{
System.out.println("click me") ;
}
}


  下面是回放的程序,在下面的程序中用到了java.awt.Robot类,这个类通常用来在自动化测试或程序演示中模拟系统事件,在某些需要控制鼠标或键盘的应用程序中这个类也是很有用,这个类主要的目的就是为方便的实现Java的GUI自动化测试平台。

  在事件回放时,我们同样需要该类来模拟生成系统的事件,完成记录的操作的回放,在下面的代码中,给出了一个简单的例子。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class TestReplay extends Thread
{
public static void
main(String[] args)
{
try{
//启动要回放的应用程序
Frame1.main(new String[]{null}) ;
//等应用程序启动后延迟3秒再进行回放
Thread.currentThread().sleep(3000) ;
Robot robottest=new Robot();
robottest.waitForIdle();
//根据标题名获取当前应用的主窗体,
在本例中为"test"
Frame jframe=getFrame("test");;
//根据给定的窗体和窗体中要
find的控件的名称来获取控件的引用
JButton jbtn=getButton(jframe,"jButton1");
//将鼠标移到控件所在的位置
robottest.mouseMove
(jbtn.getLocationOnScreen().
x+jbtn.getWidth()/2
,jbtn.getLocationOnScreen().
y+jbtn.getHeight()/2) ;
//在控件所在位置,生成鼠标点击事件
robottest.mousePress
(InputEvent.BUTTON1_MASK ) ;
robottest.mouseRelease
(InputEvent.BUTTON1_MASK ) ;
}catch(Exception ee){
ee.printStackTrace() ;
}
}
//获得标题为title的frame
private static Frame
getFrame(String title)
{
Frame[] jframes=(Frame[])
JFrame.getFrames();
for(int i=0;i i++)
{
if(jframes[i].getTitle().
equalsIgnoreCase(title))return jframes[i];
}
return null;

}
//获取某一个frame下的某个名为jButton1的控件
private static JButton
getButton(Frame jf,String text)
{
/*注意下面这行代码,因为实例比较简单
只有ContentPane一个Container类型的控件,
如果在JFrame中有多个Container控件
//的话,必须进行递归处理,搜索出所有的控件
*/
Component[] coms=((JFrame)jf).
getContentPane().getComponents();
for(int i=0;i i++)
{
if(!(coms[i] instanceof
JButton))continue;
if(((JButton)coms[i]).
getText().equalsIgnoreCase(text))
return (JButton)coms[i];
}
return null;
}
public void run(){

}
}


  该程序运行完,你会发现在控制台同样打印出了:

  "click me"的字符串说明事件被正确回放了。
键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品