【问题标题】:Java Robot - Class functions issueJava Robot - 类函数问题
【发布时间】:2012-08-01 01:08:06
【问题描述】:

我正在尝试为 Java AWT 机器人创建一个单独的类以用于项目,但我无法按照我的意愿设置它,因为我在网上找到的所有示例似乎都将代码打包成一个 . java 文件。

我的代码运行良好,但我想知道是否可以以更好的方式设置函数。

RobotLib.java 类的代码如下:

package com.z;

import java.awt.*;
import java.awt.event.*;
import java.util.*;

    public class RobotLib {

    private static Robot robot;

    // Press Function
    public void Press(int key, int time){ 
        try {
        Robot robot = new Robot();
            robot.keyPress(key);
            robot.delay(time);
            robot.keyRelease(key);

        } catch (AWTException e) {
            e.printStackTrace();
        }
    } 

}

而我的 Example.java 代码是:

package com.z;

import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class Example {

    public static void main(String[] args) {

        RobotLib robot = new RobotLib();

        robot.Press(KeyEvent.VK_A,100); // type a

    }
}

对于 RobotLib.java 类,我想知道是否有可能在不使用 try/catch 和 new Robot() 包装的情况下拥有这些功能,所以不是上面的版本,而是这样的:

public void Press(int key, int time){ 
    robot.keyPress(key);
    robot.delay(time);
    robot.keyRelease(key);
}

try/catch 和 new Robot() 似乎是必需的,但是如果我把它们拿走,我会得到这样的错误:

Exception in thread "main" java.lang.NullPointerException
    at com.z.RobotLib.Press(RobotLib.java:35)
    at com.z.Example.main(Example.java:14)

我对 Java 编码很陌生,可能以错误的方式设置类,有没有办法修复该错误或拥有我想要的功能?

【问题讨论】:

    标签: java class awt awtrobot


    【解决方案1】:

    是的,您确实需要其中的 try/catch 块,但是是的,还有一种方法可以更好地设置这些功能。不需要每次调用Press 方法时都创建机器人。在构造函数中创建静态 Robot 实例。

    public class RobotLib {
    
    private static Robot robot;
    
    public RobotLib(){
      robot = new Robot();
    }
    
    // Press Function
    public void Press(int key, int time){ 
        try {
            robot.keyPress(key);
            robot.delay(time);
            robot.keyRelease(key);
    
        } catch (AWTException e) {
            e.printStackTrace();
        }
    } 
    
    }
    

    【讨论】:

    • 谢谢,我尽量避免使用 try、catch 和 new Robot()。基本上,我想缩短函数并使它们类似于您可以在网上找到的机器人类示例,它们使用单​​个 .java 文件。就像我在错误消息上方接近结尾的方式一样,这可能在课堂上吗?
    • 我想我会按照你的建议进行设置,所以我接受了你的回答,如果能够避免每个函数的 try catch 会很好,但我想这是不可能的在一个班级。感谢您的帮助。
    • 实际上已经测试了你的代码,它给了我错误。 new Robot() 和 AWTException 在 Eclipse 中突出显示。知道如何纠正这个问题吗?
    • 您需要确保正确导入了 AWTException。我还假设 Robot 类有一个空的构造函数,但上面的代码也是如此。它报告了什么样的错误?
    • 我不确定如何按照您的建议导入 AWTException,我的代码出现此错误:线程“main”java.lang.Error 中的异常:未解决的编译问题:未处理的异常类型 AWTException Unreachable捕获 AWTException 的块。 com.z.RobotLib.(RobotLib.java:93) at com.z.Example.main(Example.java:9) 的 try 语句体永远不会抛出此异常
    【解决方案2】:

    不太确定您的问题,但我希望这可能会有所帮助!

    您可以抛出异常以避免不必要的 try 和 catch 块。此外,创建类 Robot 的实例将使您避免在需要它的每一行编写 new Robot()。

    【讨论】:

    • 欢迎来到 SO。尝试通过添加您的说法的代码示例来改善您的答案:)
    • 非常感谢...很快就会相处得很好.. 真好,菲利克斯
    【解决方案3】:

    我刚刚找到了一种使用 Raskolnikov 发布的代码的修改版本来做我想做的事情的方法,它允许我想要的功能的更短版本:

    public class RobotLib {
    
    private static Robot robot;
    
    public RobotLib(){
      try {
        robot = new Robot();
    } catch (AWTException e) {
        e.printStackTrace();
    }
    }
    
    // Press Function
    public void Press(int key, int time){ 
        robot.keyPress(key);
        robot.delay(time);
        robot.keyRelease(key);
    } 
    
    }
    

    【讨论】:

      猜你喜欢
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      相关资源
      最近更新 更多