Java程序启动另外一个UI程序(具有图形用户界面的程序),例如操作系统的calc.exe(计算器或别的Java打包的jar程序),然后人工对calc.exe进行操作,在该过程中,控制台Java程序把操作的事件记录到一个文件中,控制台结束录制,然后重新启动UI程序,读取文件中的事件对UI程序进行操作(该过程就是回放)。PS:可能用到的类(我不太清楚):EvenQueue,InvocationHandler,Robot也许还用到反射等知识,例如识别程序的控件的问题等。

解决方案 »

  1.   

    本人写了一个,但没成功。
    用一个ArrayList保存事件(暂且不用理会写文件的细节)的实现:import java.awt.*;
    import java.awt.event.*;
    import java.beans.*;
    import java.io.*;
    import java.lang.reflect.*;
    import java.util.*;import 框架.CalculatorFrame;import javax.swing.JFrame;public class EventTracer2 {
    private InvocationHandler handler;
    Scanner input=new Scanner(System.in);
    ArrayList<ActionEvent> elist=new ArrayList<ActionEvent>(); public EventTracer2(){
    handler=new InvocationHandler(){
    public Object invoke(Object proxy,Method method,Object[] args){
    if(args[0] instanceof ActionEvent){
    elist.add((ActionEvent)args[0]);
    String str=((ActionEvent)args[0]).getActionCommand();
    System.out.print(str);
    }
    return null;
    }
    };
    } public void addListener(Component c,EventSetDescriptor eventSet){
    Object proxy=Proxy.newProxyInstance(null, new Class[]{eventSet.getListenerType()},handler);
    Method addListenerMethod=eventSet.getAddListenerMethod();
    try {
    addListenerMethod.invoke(c, proxy);
    } catch (IllegalArgumentException e) {
    } catch (IllegalAccessException e) {
    } catch (InvocationTargetException e) {
    }
    }

    public void add(Component c){
    try {
    BeanInfo info=Introspector.getBeanInfo(c.getClass());
    EventSetDescriptor[] eventSets=info.getEventSetDescriptors();
    for(EventSetDescriptor eventSet:eventSets){
    addListener(c,eventSet);
    }
    } catch (IntrospectionException e) {
    }
    if(c instanceof Container){
    for(Component comp:((Container)c).getComponents()){
    add(comp);
    }
    }
    }

    public void replay(CalculatorFrame f){
    EventQueue eq = f.getToolkit().getSystemEventQueue();
    for(ActionEvent aEvent:elist){
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    ActionEvent ae=new ActionEvent(aEvent.getSource(),aEvent.getID(),aEvent.getActionCommand(),System.currentTimeMillis(),aEvent.getModifiers());
    System.out.println(ae);
    eq.postEvent(ae);
    }
    }

    public static void main(String[] args){
    CalculatorFrame f=new CalculatorFrame();
    EventTracer2 tracer=new EventTracer2();
    tracer.add(f);
    try {
    Thread.sleep(2000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    Scanner input=new Scanner(System.in);
    input.nextLine();
    System.out.println("回放");

    try {
    Thread.sleep(2000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    tracer.replay(f);
    }
    }