我试图在释放向上键时将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 |]
所以目前,我可以将它设置为后面,但这需要光标跳转。反正有没有做得更好?
答案 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中处理事件。