java - KeyEvent停止监听JavaFX

标签 java javafx keyevent

我有一个非常简单的 KeyEvent:

@Override
public void start(Stage stage) throws Exception {
    Group root = new Group();
    Scene scene = new Scene(root);
    Canvas canvas = new Canvas( 900, 700 );

    scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent ke) {

            switch (ke.getCode()) {
                case UP:
                    System.out.println("UP");
                    break;
                case DOWN:
                    System.out.println("DOWN");
                    break;
                case LEFT:
                    System.out.println("LEFT");
                    break;
                case RIGHT:
                    System.out.println("RIGHT");
                    break;
                case ENTER:
                    //ke.consume();
                    break;
                default:
                    break;
            }
        }});

我想要达到的目标: 我开始运行程序,如果我按上、下、左、右,输出会写回给我上、下、左、右(这是正确的,没有问题)。 但!如果我按 Enter,如果我按上、下、左、右、Enter 或其他键,则不会写回输出 UP、DOWN、LEFT、RIGHT。

所以我喜欢在按下 ENTER 按钮时停止 KeyEvent“运行”。

最佳答案

你有几个机会,我首先想到的是这两个。

1) 将关键事件的监听器存储为类的成员,然后按 ENTER 键取消注册。

private EventHandler<KeyEvent> keyHandler;


@Override
public void start(Stage stage) {
    final Scene scene = new Scene(new Group());
    stage.setTitle("Table View Sample");
    stage.setWidth(450);
    stage.setHeight(500);

    keyHandler = new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent ke) {

            switch (ke.getCode()) {
                case ENTER:
                    scene.removeEventHandler(KeyEvent.KEY_PRESSED, keyHandler);
                    break;
                case UP:
                    System.out.println("UP");
                    break;
                case DOWN:
                    System.out.println("DOWN");
                    break;
                case LEFT:
                    System.out.println("LEFT");
                    break;
                case RIGHT:
                    System.out.println("RIGHT");
                    break;


                default:
                    break;
            }
        }};

   scane.addEventHandler(KeyEvent.KEY_PRESSED, keyHandler);

2) 按 ENTER 键时,将 boolean 值存储到成员,如果设置了该成员,则使用该事件。

private Boolean enterPressed = false;

@Override
public void start(Stage stage) {
    final Scene scene = new Scene(new Group());
    stage.setTitle("Table View Sample");
    stage.setWidth(450);
    stage.setHeight(500);

   scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent ke) {

            if(enterPressed){
                ke.consume();
                return;
            }

            switch (ke.getCode()) {
                case ENTER:
                    enterPressed = true;
                    break;
                case UP:
                    System.out.println("UP");
                    break;
                case DOWN:
                    System.out.println("DOWN");
                    break;
                case LEFT:
                    System.out.println("LEFT");
                    break;
                case RIGHT:
                    System.out.println("RIGHT");
                    break;

                default:
                    break;
            }
        }});

两者都有效,选择你喜欢的。

关于java - KeyEvent停止监听JavaFX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37235840/

相关文章:

java - 类是原始类型。对泛型 Class<T> 的引用应该被参数化

Java FX : FileChooser and file extension

java - Gradle多模块,子项目看不到依赖关系

java - 当附加(非模式)窗口关闭时,如何防止将主应​​用程序窗口置于前面。 Mac 操作系统、JavaFX

keyevent - 什么时候应该使用 keydown 和 keyup?

java - 没有局部变量的java中的递归

java - 如何避免 LinearLayout 上的按钮重叠?

swift - 捕获 Mac OS X 上的功能键

java - 重建 Maven 索引卡在 0%

android - 从 Android Activity 中的软件键盘监听 Webview Key Events