我试图将 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/