2016-04-01 4 views
1
アップキーが解放されたとき、私は終わりにするのTextFieldのカーソル/キャレットを設定しようとしています

JavaFXのテキストフィールド - キーまでにリリースされたのデフォルトの動作をオーバーライドします

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キーがリリースされます。

私は、UPのためだけに(以下に示すように)setOnKeyReleasedをオーバーライドすることを考えましたが、これはカーソルが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]
リリースUP://カーソルが戻って文字列
のTextField [NEWSTRINGのある|]

ので、現在、私は背中に行くためにそれを設定することができていますが、これは周りのジャンプカーソルを伴います。とにかくそれをより良くするには?イベントハンドラを設定し、イベントを消費することによって

:これを達成するために2つの方法を示したものサンプルアプリケーションで

+0

おそらく 'onKeyTyped'-(関数名が間違っているかもしれません)を試すことができますか?そこにあなたのコードを押してください。最後のキーイベント関数を検索する3 – Elltz

答えて

1

表情。

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

やイベントをフィルタリングすることによって、あなたはイベントがJavaFXの中で処理されている方法を学ぶことhttp://docs.oracle.com/javase/8/javafx/events-tutorial/events.htmをご覧ください

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

その伝播を停止します。

+1

おかげさまで、私は 'e.consume();'アプローチをとることにしました。そして、あなたがリンクしたチュートリアルを見てみましょう。 – fer

関連する問題