我使用 jnativehook 进行全局键盘监听。我在 JavaFX 11 中创建了 GUI。我有一个 TextField 来定义按下指定组合键后创建的文件的名称。
问题是我无法通过键盘编辑 TextField 中的文本。我可以用鼠标删除或粘贴文本,但不能用键盘。
我为全局键盘监听创建了一个单独的线程。我的想法是在 TextField 聚焦时停止这个线程。不幸的是,我的尝试失败了。
这是导致类似问题的最小可重复示例:
主.java
public class Main extends Application {
private static final int APP_WIDTH = 400;
private static final int APP_HEIGHT = 400;
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
var fxmlLoader = new FXMLLoader(getClass().getResource("/main.fxml"));
Parent root = fxmlLoader.load();
stage.setTitle("Example");
stage.setScene(new Scene(root, APP_WIDTH, APP_HEIGHT));
stage.show();
Thread background = new Thread(() -> Platform.runLater(() -> {
GlobalKeyboardHook keyboardHook = new GlobalKeyboardHook(true);
keyboardHook.addKeyListener(new GlobalKeyAdapter() {
@Override
public void keyPressed(GlobalKeyEvent keyEvent) {
System.out.println("Key pressed: " + keyEvent.getVirtualKeyCode());
}
@Override
public void keyReleased(GlobalKeyEvent keyEvent) {
System.out.println("Key released: " + keyEvent.toString());
}
});
}));
background.start();
}
控制器.java
public class Controller implements Initializable {
@FXML
private TextField filePath;
private static String filePathString = "filePathString";
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
handleFilePath();
}
private void handleFilePath() {
filePath.textProperty().setValue(filePathString);
filePath.textProperty().addListener(((observable, oldValue, newValue) -> {
filePath.commitValue();
}));
}
}