爪哇(Java)的“机器人”

ZDNet软件频道 时间:2001-10-16 作者:高秀霞 |  我要评论()
本文关键词:Java
Java的 JDK 1.3 中有个有趣的类别,名为 Robot(机器人)。

写在前头
Java是目前在网页中常用的一种手段,最近又增加了一些很有新趣的功能,例如在Java的 JDK 1.3 中就有个有趣的类别,名为 Robot(机器人)。这个类别主要用来产生使用者本身这个系统事件,或根据使用者的需要(例如程序需要自动展示一些功能等)来控制鼠标或键盘。本文就来简单介绍一下这个 Robot(机器人)。

在 Robot 这个类别中产生的事件有别于在 AWT 元件中的事件,在 AWT 元件中的事件(例如 MouseEvent、KeyEvent等)会被放置在 AWT的事件队列中等候处理。但您用 Robot 这个类别所产生的事件,则会被放置在操作系统的事件队列中等候处理。例如,当你用了 Robot 中的 Robot.mouseMove() 这个方法,就表示真的让您的鼠标移动了,而不像 AWT 事件中只是产生鼠标移动的事件而已。

在这里要注意的是,由于 Robot 产生了一些较低阶的控制,所以一旦当前系统不允许您从事这些控制时,就会发出 AWTException 这个例程来通知您。


范例程序

下面是个简单的 Robot 范例程序,执行后鼠标将会移动到左上角第一个图标位,按鼠标右键后选择打开。
import Java.awt.*;
import Java.awt.event.*;
public class example1 {
    Robot robot=null;
    void initial() {
        try {
                // 产生一个 Robot 类别的物件
                robot = new Robot();
            }
            catch (AWTException ex) {}
    }
    void start() {
        // 一开始希望鼠标移动到的座标
        int initX = 30, initY = 10;
        //然后希望移动到的鼠标座标
        int disX = 120, disY = 20;
        // 目前鼠标的位置座标
        int mouseX, mouseY;
        mouseX = initX;
        mouseY = initY;
        // 延迟了 3 秒钟
        robot.delay(3000);
        // 移动到 左上角第一个图标的位置
        robot.mouseMove(30,10);
        // 鼠标按下了鼠标右键
        robot.mousePress(InputEvent.BUTTON3_MASK);
        // 鼠标放开所按下的右键
        robot.mouseRelease(InputEvent.BUTTON3_MASK);
        // 停留 1 秒钟
        robot.delay(1000);
        // 鼠标移动到“打开”的位置
        for(int i = 0 ; mouseX < disX ; i++) {
            mouseX = mouseX + i;
            robot.mouseMove(mouseX, mouseY);
            robot.delay(50);
        }

        for(int j = 0 ; mouseY < disY ; j++) {
            mouseY = mouseY + j;
            robot.mouseMove(mouseX, mouseY);
            robot.delay(50);
        }
        // 停留 1 秒钟后按下左键
        robot.delay(1000);
        robot.mousePress(Java.awt.event.InputEvent.BUTTON1_MASK);
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
    }
    public static void main(String[] args) {
        example1 ex=new example1();
        ex.initial();
        ex.start();
        System.exit(0);
    }
}


JDK 中增加的这个类别,可让我们用于重复性很高的动作,例如:如果你想增加自己网站的“访问人数”,只需重复点选 reload 按钮就行了 ^_^。

另外还有很多其它应用,有待大家一起挖掘。


机器人中的“另类”
在Robot 类别中一个比较特殊的method:
BufferedImage createScreenCapture(Rectangle screenRect)
顾名思义,当我们使用这个这个 method 时,就会建立一张影像,而这张影像中存的的则是我们从屏幕撷取出来的像素(pixel)。而使用这个 method,就会传回一个 BufferedImage 类别的物件,我们可以根据我们的需要来对它进行处理。下面是个简单的范例,在这个范例中,程序会在使用者希望停留的秒数钟后截取屏幕,并将文件用 jpg 格式保存。

/*
* @(#)ScreenCapture.Java 2001/09/24
* Usage: Java ScreenCapture [-d seconds] [-f filename]
* @Author
* Cheng-Yu Chang <ccy0927@neural.ee.ncku.edu.tw>
* @License
* GPL(GNU GENERAL PUBLIC LICENSE)
* http://www.gnu.org/copyleft/gpl.html
*/
import Java.awt.*;
import Java.awt.image.*;
import Java.io.*;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
public class ScreenCapture {
    public static void ScreenCapture(int seconds, String filename) {
        Robot robot = null;
        // 产生 Robot 物件,记着要 catch AWTException
        try {
            robot =new Robot();
            // 延迟使用者输入的秒数
            robot.delay(seconds);
            // 将截取的 image 转换成 jpg 格式
            OutputStream f = new FileOutputStream(filename);
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(f);
            encoder.encode(robot.createScreenCapture(new Rectangle
            (Toolkit.getDefaultToolkit().getScreenSize())));
            f.close();
        }
        catch(AWTException e1) {}
        catch(IOException e2) {}
    }

    // 使用说明

    private static void usage() {
        System.out.println("Usage: Java ScreenCapture [-d seconds] [-f filename]");
        System.out.println(" -d Seconds to delay before capturing screen");
        System.out.println(" -f JPG filename to save");
        System.exit(0);
    }

    public static void main(String args[]) {
        int s = 0;
        String filename = "ScreenCapture.jpg";
        // 判定输入的参数
        if (args.length == 0)
            usage();
        else {
            for (int i = 0 ; i < args.length ; i++) {
                if (args[i].startsWith("-")) {
                    if (args[i].equals("-d")) {
                        if (i < args.length - 1)
                            s = Integer.parseInt(args[++i]);
                        else
                        usage();
                    }

                    if (args[i].equals("-f")) {
                        if (i < args.length - 1)
                            filename = args[++i];
                        else
                            usage();
                    }
                }
                else
                    usage();
            }
        }
        ScreenCapture(s * 1000, filename);
        System.exit(0);
    }

}


JDK 中的 Robot 类别,除了可执行一些繁琐的动作外,还增加了个有趣的功能,笔者在此给出简单的范例,希望在大家需要时能帮点小忙 ^_^。


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134