2016-05-15 8 views
1

У меня есть очень просто KeyEvent:KeyEvent остановить прослушивание JavaFX

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

То, что я хотел достичь: я начинаю запускать программу и если я нажимаю вверх, вниз, влево, вправо выход обратной записи мне UP, DOWN, LEFT, RIGHT (это не проблема). Но! Если я нажму кнопку «Ввод», то после нажатия кнопки «вверх», «вниз», «влево», «вправо», или другие клавиши не будут записывать выходные данные: «ВВЕРХ», «ВНИЗ», «ВЛЕВО», «ВПРАВО».

Так что я предпочитаю останавливать KeyEvent «работа», когда я нажимаю кнопку ENTER.

ответ

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

Оба работают, выбирают все, что вам нравится.

+0

Большое вам спасибо! Я спас свой день O.O – Dreamfire