【问题标题】:Get CapsLock-state in JavaFX在 JavaFX 中获取 CapsLock 状态
【发布时间】:2016-07-09 00:27:43
【问题描述】:

我正在尝试构建一个包含多项检查的输入表单。其中之一是检查 CapsLock 是否处于活动状态。如果我尝试与 Java Swing 一起构建此功能,它会起作用,请参见下面的代码。但在 JavaFX 中,它根本不起作用。每次检查时我都会得到相同的状态;似乎我的应用程序只是要求初始状态,然后保存它,并进一步展示它......

JavaSwing(运行良好)

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");
            }
        }
});

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

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));
        }
    }
});

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

【问题讨论】:

标签: java javafx keylistener capslock


【解决方案1】:

编辑: 问题似乎与 Windows 相关。 This question has an answer that might work for you

重复按大写锁定时,以下控制台输出对我有用:

按下大写锁定

大写锁定状态:真

按下大写锁定

大写锁定状态:假

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);
    }
}

我不确定是什么问题?

【讨论】:

  • 这很有趣。您使用的是哪个 Java 版本?你使用 OpenJDK 吗?测试了你的代码,它不像你声明的那样工作:(
  • 从您的问题来看,我没有意识到您使用的是 openjdk,所以可能是 openjdk 的问题 - 您使用它而不是 oracle 的 jdk 的任何特殊原因?
  • 不,我没有使用 OpenJDK...我使用的是 JDK 1.8.0_71...我认为您可能会使用 OpenJDK,然后您就可以使用它...只是一个想法 =)跨度>
  • 您是否尝试在另一台机器上运行您编译的 jar?只是看看是你的代码/库还是机器/键盘搞砸了?
  • 我尝试构建一个快照,并在笔记本电脑上运行它...同样的结果...我也尝试了 JDK 版本的选项...没有任何进展...仍然一样的……很奇怪……问题是为什么你会得到不同的结果? ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多