我正在尝试在基于触摸的系统的虚拟键盘上触发退格键。这是我到目前为止尝试过的代码。
Button source = new Button("Backspace");
TextField target = new TextField();
KeyEvent ke = new KeyEvent(source, target, KeyEvent.KEY_TYPED, "", "", KeyCode.BACK_SPACE, false, false, false, false);
target.fireEvent(ke);
此代码不返回任何内容...
最佳答案
可以直接制作TextField
表现得就像通过调用 target.deletePreviousChar()
按下了退格键一样,这可能是一个更好的方法。
要模拟实际按下 Backspace 键,您需要进行以下更改:
- 文本字段响应
KEY_PRESSED
事件,而不是KEY_TYPED
事件。最好生成键入按键时发生的整个事件序列:KEY_PRESSED
,KEY_TYPED
,和KEY_RELEASED
. - 文本字段必须具有焦点。您可以使用
source.setFocusTraversable(false)
阻止按钮获得焦点. KeyCode
对于KEY_TYPED
事件应该是UNDEFINED
(参见文档)。
这是 SSCCE:
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class TriggerBackspaceOnTextField extends Application {
@Override
public void start(Stage primaryStage) {
TextField textField = new TextField();
Button backspace = new Button("Backspace");
backspace.setFocusTraversable(false);
backspace.setOnAction(e -> {
KeyEvent press = new KeyEvent(backspace, textField, KeyEvent.KEY_PRESSED, "", "", KeyCode.BACK_SPACE, false, false, false, false);
textField.fireEvent(press);
KeyEvent typed = new KeyEvent(backspace, textField, KeyEvent.KEY_TYPED, "", "", KeyCode.UNDEFINED, false, false, false, false);
textField.fireEvent(typed);
KeyEvent release = new KeyEvent(backspace, textField, KeyEvent.KEY_RELEASED, "", "", KeyCode.BACK_SPACE, false, false, false, false);
textField.fireEvent(release);
});
VBox root = new VBox(10, textField, backspace);
root.setAlignment(Pos.CENTER);
Scene scene = new Scene(root, 350, 200);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
关于javafx-8 - JavaFX8 KeyEvent - 触发文本字段上的退格键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33258933/