JavaFX Textfield - 释放up键时覆盖默认行为

时间:2016-04-01 14:34:48

标签: java javafx

我试图在释放向上键时将TextField的光标/插入符号设置为结尾:

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键时,很难将TextField光标设置在最后。

我想过为{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://光标位于字符串前面
文本字段[| oldString]
释放UP://光标返回字符串
TextField [newString |]

所以目前,我可以将它设置为后面,但这需要光标跳转。反正有没有做得更好?

1 个答案:

答案 0 :(得分: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中处理事件。