Как сделать обработку событий клавиатуры?

Пытаюсь сделать самый простой автокликер. Не могу понять, как сделать так, что бы при нажатия заданной клавиши(в моем коде это space) был сделан клик.
Вот тестовый код:
public class Main extends Application {
Stage window;
Robot robot;
Scene scene;
 
public static void main(String[] args) {
    launch(args);
}
 
@Override
public void start(Stage primaryStage) throws Exception {
    window = primaryStage;
    window.setTitle("Кликер");
 
    StackPane layout = new StackPane();
    robot = new Robot();
 
 
    scene = new Scene(layout, 200, 100);
    window.setScene(scene);
    window.show();
 
 
}
public void keyPressed(KeyEvent e){
    if (e.getKeyCode()==KeyEvent.VK_SPACE) {
        for (int i = 0; i < 3; i++) {
            robot.mousePress(InputEvent.BUTTON1_MASK);
            robot.delay(300);
            robot.mouseRelease(InputEvent.BUTTON1_MASK);
            robot.delay(300);
        }
    }
 
 
}
}
  • Вопрос задан
  • 7930 просмотров
Решения вопроса 1
DeadTime
@DeadTime Автор вопроса
Проблема решена. Я использовал библиотеку awt KeyListener, но не реализовал для него 3 метода keyPressed, keyReleased, keyTyped. Поэтому я использовал библиотеку javafx.scene.input.KeyEvent.
Для того, что бы слушать нажатие клавиши пробел в JavaFX я использовал след.код:
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.scene.input.KeyEvent;

import java.awt.Robot;
import java.awt.event.InputEvent;


public class Main extends Application {
    Stage window;
    Robot robot;
    Scene scene;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        window = primaryStage;
        window.setTitle("Кликер");

        StackPane layout = new StackPane();
        robot = new Robot();

        scene = new Scene(layout, 200, 100);
        window.setScene(scene);
        window.show();

        scene.setOnKeyTyped(new EventHandler<KeyEvent>() {
            public void handle(KeyEvent ke) {
                if (ke.getCharacter().equals(" "))
                    for (int i = 0; i < 3; i++) {
                        robot.mousePress(InputEvent.BUTTON1_MASK);
                        robot.delay(300);
                        robot.mouseRelease(InputEvent.BUTTON1_MASK);
                        robot.delay(300);
                    }
            }
        });

    }
}

Вы не сможете ловить таким образом action кнопки (такие как Ctrl, Shift, функциональные кнопки и т.д.). Но setOnKeyPressed и setOnKeyReleased поймает их тоже. Так что, свободно заменяйте эту строку
scene.setOnKeyTyped(new EventHandler<KeyEvent>() {
На эту
scene.setOnKeyPressed(new EventHandler<KeyEvent>() {

Или эту
scene.setOnKeyReleased(new EventHandler<KeyEvent>() {

А проверку на нажатие допустим кнопки F12 заменить такой строкой
if (ke.getCode().getName().equals("F12"))
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы