如何在JavaFX中检测不同语言键盘上的PLUS密钥

时间:2015-09-27 16:28:13

标签: java javafx keyboard

我正在尝试检测何时按下加号键,哪个在我的英国键盘上定位在EQUALS键上,而在我的德语键盘上定位在另一个键上。我希望能够在没有用户按下SHIFT的情况下检测加号键,以防通过shift +另一个键正常达到加号。

这是普通缩放操作在例如​​浏览器中的工作方式。如何在没有列出每个键盘和相应键的位置的情况下在JavaFX中执行此操作?

例如,下面的程序(检查KeyCode.PLUS)在我的英国键盘上不起作用。我使用的是JDK 1.8.0_40。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class Test extends Application {

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

    @Override
    public void start(Stage stage) throws Exception {
        Scene scene = new Scene(new Pane());
        scene.addEventFilter(KeyEvent.KEY_PRESSED, e -> {
            if (e.getCode() == KeyCode.PLUS) {
                System.out.println("YES");
            }
        });
        stage.setScene(scene);
        stage.show();
    }
}

2 个答案:

答案 0 :(得分:4)

如果您希望它适用于所有平台和键盘布局,则需要原始字符和KeyEvent.KEY_PRESSED过滤器。来自KeyEvent文档:

  

"键入键入"事件是更高级别的,通常不依赖于   平台或键盘布局。它们是在Unicode时生成的   输入字符,是了解的首选方式   字符输入。在最简单的情况下,生成键类型事件   通过单键按下(例如,' a')。

但要注意:

  

然而,通常,字符是由一系列按键产生的   (例如,SHIFT +' a'),以及从按键事件到键的映射   键入的事件可以是多对一或多对多。

将它们混合可以得到一个相当难看且难以理解的代码。

所以你的例子应该是这样的:

更新

我已将事件更改为KEY_PRESSED并使您的示例(Ctrl +' +')尝试工作,即使代码相等或字符相等。在大多数情况下,它适用于代码,但有时charCombo适合。

我已尝试使用英语(英国),法语,德语,西班牙语键盘布局的以下代码,它可以正常运行。

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.input.KeyCharacterCombination;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyCodeCombination;
import javafx.scene.input.KeyCombination;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class Test extends Application {

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

    @Override
    public void start(Stage stage) throws Exception {
        Scene scene = new Scene(new Pane(), 300, 300);
        scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
            KeyCombination charCombo = new KeyCharacterCombination("+", KeyCombination.CONTROL_DOWN);
            KeyCombination codeCombo = new KeyCodeCombination(KeyCode.PLUS, KeyCombination.CONTROL_DOWN);

            @Override
            public void handle(KeyEvent event) {
                if (charCombo.match(event) || codeCombo.match(event)) {
                    System.out.println("Zoom in");
                }
            }
        });

        stage.setScene(scene);
        stage.show();
    }
}

答案 1 :(得分:1)

我测试了你的程序,工作组合是测试:

  • KeyCode.ADD:这对应于小键盘上的+键;
  • KeyCode.EQUALS:这与=键相对应,因为您不希望用户按Shift
  • KeyCode.PLUS:当上限被锁定时,这与=键相对应。
public class Test extends Application {

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

    @Override
    public void start(Stage stage) throws Exception {
        Scene scene = new Scene(new Pane());
        scene.addEventFilter(KeyEvent.KEY_PRESSED, e -> {
            if (e.getCode() == KeyCode.ADD || e.getCode() == KeyCode.EQUALS || e.getCode() == KeyCode.PLUS) {
                System.out.println("YES");
            }
        });
        stage.setScene(scene);
        stage.show();
    }
}