首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KeyEvent停止听JavaFX

KeyEvent停止听JavaFX
EN

Stack Overflow用户
提问于 2016-05-15 07:59:21
回答 1查看 2.2K关注 0票数 1

我有一个非常简单的KeyEvent:

代码语言:javascript
复制
@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按钮时,我就会停止KeyEvent的“运行”。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-15 09:02:47

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

1)将键事件的侦听器存储为类的成员,并在输入时按下取消注册.

代码语言:javascript
复制
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)在按下输入键时,将布尔值存储到成员,如果设置了该成员,则使用事件.

代码语言:javascript
复制
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;
            }
        }});

两者都在工作,选择你喜欢的任何东西。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37235840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档