我正在创建一个应用程序,我想要一个功能,当用户按下E时,它会将鼠标指针设置到屏幕的中心(使用moveMouse()方法).然而,它只给了我IlLegalStateException异常分.

我试着用GlassRobot来代替(从this个问题中得到一个可接受的答案),但这只给了我一个IllegalAccessException.我做错了什么?我需要加点什么吗?

Code and Error

IlLegalStateException异常

100:下面有一条 comments

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1082)
Caused by: java.lang.ExceptionInInitializerError
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:465)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364)
    ... 5 more
Caused by: java.lang.IlLegalStateException异常: This operation is permitted on the event thread only; currentThread = main
    at javafx.graphics/com.sun.glass.ui.Application.checkEventThread(Application.java:447)
    at javafx.graphics/javafx.scene.robot.Robot.<init>(Robot.java:70)
    at com.galactify.tiles/com.galactify.tiles.HelloApplication.<clinit>(HelloApplication.java:37) // This is where the Robot object is created
    ... 11 more

场景机器人宣言

private static final Robot robot = new Robot() ;

玻璃机器人宣言

private static final Robot robot = com.sun.glass.ui.Application.GetApplication().createRobot() ;

Methods used to set the mouse pointer to the center when user presses E

static void onKeyReleased(KeyEvent evt) {
        KeyCode key = evt.getCode() ;
        out.println(key + " is released") ;

        switch (key) {
            case F11 -> {
                stage.setFullScreen(!isFullscreen) ;
                isFullscreen = !isFullscreen ;
            }

            case C -> {
                stage.close() ;
                isClosed = true ;
            }

            case E -> setupInventory() ;

        }
    }
static void setupInventory() {
        robot.mouseMove((double) screenWidth / 2, (double) screenHeight / 2) ;
    }

推荐答案

The question you refer to is outdated (don't use GlassRobot)

该问题提到提出使GlassRobot功能成为公共API的请求.这个请求是几年前在JavaFX 11中完成的,公共API是Robot(您在问题中已经使用了它).

没有必要使用非公共的GlassRobotAPI,并且有很多理由不使用它.

错误消息会告诉您问题所在

This operation is permitted on the event thread only; currentThread = main  

您有robot个声明为应用程序类的静态成员.静态成员在加载类时初始化.您的主应用程序类将加载到主Java线程上.但是,错误消息指出Robot must已加载到JavaFX线程上.

如何解决您的问题

将您的声明更改为:

private Robot robot;

在你的start()方法中初始化机器人(或者在JavaFX应用程序线程上调用的其他方法):

@Override
public void start(Stage stage) {
    robot = new Robot();
    // other app logic
}

忠告

通常,最好尽量减少Java应用程序中的静态和初始化.一个原因是,如果初始化失败并抛出异常,那么类将无法加载,这可能很难理解(正如您在这里可能已经发现的那样).避免处于静态状态还有其他原因.请注意,此建议主要适用于静态.不依赖于静态的静态方法(such as those in the Math class)有时可能会很好.

如果您想更多地了解JavaFX中的线程化,请阅读Application lifecycle documentation.

Java相关问答推荐

是否可以从@ TrustMapping中删除特定方法的基路径?

那么比较似乎不是词典学的,尽管doctor 这么说

Java List with all combinations of 8 booleans

无法在org. openjfx:javafx—fxml:21的下列变体之间进行 Select

Java inline Double条件和值解装箱崩溃

给定Java枚举类,通过值查找枚举

上下文初始化期间遇到异常-使用Java配置配置HibernateTemplate Bean时

在模拟超类中设置非setter属性的值

Java FX中的河内之塔游戏-在游戏完全解决之前什么都不会显示

基于调车场算法的科学计算器

如何获取Instant#of EpochSecond(?)的最大值

如何在JavaFX循环中完美地制作一个AudioClip/MediaPlayer?

JNI:将代码打包成自包含的二进制文件

Regex以查找不包含捕获组的行

TinyDB问题,无法解析符号';上下文&

如何在Struts2中使用操作类中的结果注释重定向到不同的命名空间

按长度排序字符串数组

Eureka客户端无法使用用户/通行证注册到Eureka服务器

使用原子整数的共享计数器并发增量

无泄漏函数的Java DRY