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

标签 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;
            }

        }
    });

或者从视觉上看,它是这样的:

在按任何内容之前://光标位于字符串末尾
文本字段[oldString |]
Press UP://光标位于字符串前面
文本字段[|旧字符串]
Release UP://光标位于字符串后面
文本字段[newString |]

目前,我可以将其设置为返回到后面,但这需要光标四处跳跃。有什么办法可以做得更好吗?

最佳答案

看看那些示例应用程序,它们展示了实现此目的的两种方法:

通过设置事件处理程序并使用事件。

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 中如何处理事件。

关于JavaFX Textfield - 释放向上键时覆盖默认行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36359046/

相关文章:

java - 在 JavaFX 中调整窗口大小时动态调整图形大小

java - 由于类别数据太长,使用 JavaFx 使用 Slider 创建引人注目的 BarChart 来查看

java - 向后打印数组 - 不打印最后一个条目! - java

java - Final block 何时相对于 Return 运行

java - 所有JPA规范查询之间的AND运算

java - 如何暂停 AnimationTimer 设定的秒数?

java - 正则表达式从 00001 到 99999

java - 如何根据前一个组合框的内容更改组合框的内容?

java - 尝试使用 JavaFX 播放音频文件

JavaFX WebView 浏览器