【问题标题】:KeyEvent stop Listening JavaFXKeyEvent 停止监听 JavaFX
【发布时间】:2016-05-15 07:59:21
【问题描述】:

我有一个非常简单的 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 按钮时停止 KeyEvent“运行”。

【问题讨论】:

    标签: java javafx keyevent


    【解决方案1】:

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

    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 按下时,将布尔值存储到成员,如果设置了该成员,则使用该事件。

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

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

    【讨论】:

    • 非常感谢!我拯救了我的一天 O.O
    猜你喜欢
    • 2023-03-14
    • 2013-03-13
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2021-10-30
    相关资源
    最近更新 更多