在JavaFX中获取CapsLock状态

在JavaFX中获取CapsLock状态,java,javafx,keylistener,capslock,Java,Javafx,Keylistener,Capslock,我正在尝试构建一个带有多个检查的输入表单。其中之一是检查CapsLock是否处于活动状态。如果我尝试与JavaSwing一起构建这个函数,它就会工作,请参见下面的代码。但在JavaFX中,它根本不起作用。我每次检查都得到相同的状态;看起来我的应用程序只是请求初始状态,然后保存它,并进一步显示它 JavaSwing(工作正常) JavaFX(始终呈现相同的状态) scene.setOnKeyReleased(新的EventHandler(){ @凌驾 公共无效句柄(javafx.scene.inp

我正在尝试构建一个带有多个检查的输入表单。其中之一是检查CapsLock是否处于活动状态。如果我尝试与JavaSwing一起构建这个函数,它就会工作,请参见下面的代码。但在JavaFX中,它根本不起作用。我每次检查都得到相同的状态;看起来我的应用程序只是请求初始状态,然后保存它,并进一步显示它

JavaSwing(工作正常)

JavaFX(始终呈现相同的状态)

scene.setOnKeyReleased(新的EventHandler(){
@凌驾
公共无效句柄(javafx.scene.input.KeyEvent事件){
if(event.getCode()==KeyCode.CAPS){
系统输出打印项次(“CAPS”);
System.out.println(Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK));
}
}
});

有人知道为什么吗?我能做什么?

编辑:这似乎是一个与windows相关的问题

重复按下caps lock时,以下控制台输出适用于我:

卡普斯洛克压榨机

Capslock状态:正确

卡普斯洛克压榨机

Capslock状态:false


我不确定问题出在哪里?

这个问题还包含了为什么它在Swing中工作,而不是在JavaFX中。不可能,这其中有一个bug,非常有趣。您使用的是哪个Java版本?你使用OpenJDK吗?测试了您的代码,但它没有按照您所说的那样工作:(从您的问题中,我没有意识到您使用的是openjdk,所以openjdk可能有问题-您使用它而不是oracle的jdk的具体原因是什么?不,我没有使用openjdk…我使用的是jdk 1.8.071…我以为您可能会使用openjdk,然后您就可以使用它了…只是一个想法=)您是否尝试在另一台机器上运行已编译的jar?只是想看看是你的代码/库还是机器/键盘出了问题?我试着创建一个快照,并在笔记本电脑上运行它。。。同样的结果。。。我也尝试过JDK版本的选项。。。没有任何进展。。还是一样。。。很奇怪。。。问题是你为什么会得到不同的结果
frame.addKeyListener(new KeyListener() {
        public void keyTyped(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_CAPS_LOCK){
                System.out.println(Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK));
            } else if(e.isShiftDown()){
                System.out.println("SHIFT");
            }
        }

        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_CAPS_LOCK){
                System.out.println(Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK));
            } else if(e.isShiftDown()){
                System.out.println("SHIFT");
            }
        }

        public void keyReleased(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_CAPS_LOCK){
                System.out.println(Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK));
            } else if(e.isShiftDown()){
                System.out.println("SHIFT");
            }
        }
});
scene.setOnKeyReleased(new EventHandler<javafx.scene.input.KeyEvent>() {
    @Override
    public void handle(javafx.scene.input.KeyEvent event) {
        if(event.getCode() == KeyCode.CAPS){
            System.out.println("CAPS");
            System.out.println(Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK));
        }
    }
});
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

import java.awt.*;
import java.awt.event.KeyEvent;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {

        Pane root = new Pane();
        Scene scene = new Scene(root, 500, 500);

        primaryStage.setScene(scene);
        primaryStage.show();

        //scene.setOnKeyPressed( event -> {
        scene.setOnKeyReleased( event -> {
            if ( event.getCode() == KeyCode.CAPS ) {
                System.out.println("Capslock pressed");
                System.out.println("Capslock state: " + Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK));
            }
        });

    }

    public static void main(String[] args) {
        launch(args);
    }
}