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"的字符串说明事件被正确回放了。
|