2016-04-01 2 views
1

Я пытаюсь установить TextField в курсор/каретку, чтобы быть в конце, когда ключ до Выпущено:JavaFX TextField - поведение по умолчанию Override, когда до отпускания клавиши

private void setTextFieldBehaviour() { 
    _textField.setOnKeyPressed(new EventHandler<KeyEvent>() { 
     @Override 
     public void handle(KeyEvent key) { 
      switch (key.getCode()) { 
       case UP: 
        if (key.isControlDown()) { 
          ... // Do something for Ctrl + UP key 
          break; 
        } else { 
         ... // Do something for plain old UP key 
         _textField.end(); 
         // _textField's cursor will go back 
         // to the front when the UP key is released! 
         break; 
        } 
       default: 
        break; 
      } 
     } 
    }); 
} 

Однако, как указано выше в кодексе комментарий, потому что я только переопределяю метод setOnKeyPressed, это означает, что поведение по умолчанию при отпускании клавиш будет использоваться для текстового поля JavaFX,

Следовательно, это затрудняет установку курсора TextField в конце, когда UP выдается ключ.

Я думал об переопределении setOnKeyReleased только для UP (как показано ниже), но это имеет уродливый эффект курсора, прыгающего в переднее поле TextField, а затем прыгающего назад в конец.

_textField.setOnKeyReleased(new EventHandler<KeyEvent>() { 
     @Override 
     public void handle(KeyEvent key) { 
      switch(key.getCode()) { 
       case UP: 
        if(!(key.isControlDown())) { 
         ... // Do something for plain old UP key 
         _textField.end(); 
         // _textField's cursor will go back 
         // to the front when the UP key is released 
         // then jump back to the end again! 
         break; 
        } 
       default: 
        break; 
      } 

     } 
    }); 

Или визуально, это то, как он появляется:

Перед нажатием клавиши ничего: // Курсор помещается в конце строки
TextField [oldString |]
Нажмите UP: // Курсор перед строкой
TextField [| oldString]
Release UP: // Курсор возвращается строки
TextField [NewString |]

Так в настоящее время, я могу установить его, чтобы перейти к спине, но это влечет за собой курсор прыгает вокруг. Есть ли способ сделать это лучше?

+0

вы можете попробовать, возможно, 'onKeyTyped'- (имя функции может быть неправильным)? и нажмите свои коды там. но поиск функции keyevent последний из них 3 – Elltz

ответ

1

взгляд на тех приложениях, которые показывают образец 2 способа для достижения этой цели:

путем установки обработчика событий и потребляя событие.

public class main extends Application { 

@Override 
public void start(Stage primaryStage) { 

    HBox root = new HBox(); 

    TextField textField = new TextField(); 

    textField.setOnKeyPressed(e -> { 

     if (e.getCode().equals(KeyCode.UP)) { 
      textField.end(); 
      e.consume(); // this stop propagating the event 
     } 

    }); 

    root.getChildren().add(textField); 
    Scene scene = new Scene(root, 300, 300); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

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

или путем фильтрации событие и остановить его распространение

public class main extends Application { 

@Override 
public void start(Stage primaryStage) { 

    HBox root = new HBox(); 

    TextField textField = new TextField(); 

    textField.addEventFilter(KeyEvent.KEY_PRESSED, e -> { //event filter first catch the event 

     if(e.getCode().equals(KeyCode.UP)){ 
      textField.end(); 
      e.consume(); // this stop propagating the event 
     } 
    }); 


    root.getChildren().add(textField); 
    Scene scene = new Scene(root, 300, 300); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

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

Вы должны смотреть на http://docs.oracle.com/javase/8/javafx/events-tutorial/events.htm, чтобы узнать, как события обрабатываются в JavaFX.

+1

Спасибо, я решил пойти с подходом 'e.consume();', и он работал красиво. И я обязательно посмотрю на учебник, который вы связали. – fer

Смежные вопросы