JavaFX Canvas не собирает ключевые события

89
8

У меня есть следующий код, показывающий холст JavaFX с тремя последовательными мирами приветствия


    StackPane root = new StackPane();

Canvas canvas = new Canvas(250,250);
canvas.setOnMouseEntered((a) -> System.out.println("hi"));
canvas.setOnMousePressed((a) -> System.out.println("focus"));
canvas.setOnKeyReleased(new EventHandler<KeyEvent>() {

@Override
public void handle(KeyEvent event) {
System.out.println("Handled");
}
});
// canvas.setOnKeyPressed((a) -> System.out.println("hi"));

GraphicsContext context = canvas.getGraphicsContext2D();
context.setFill(Color.BLUE);
final int fontSize = 15, fontSpace = 5;
context.setFont(Font.font(15));

context.fillText("hello world", 75, 75);
context.fillText("hello world", 75, 75 + fontSize + fontSpace);
context.fillText("hello world", 75, 75 + (fontSize + fontSpace) * 2);

root.getChildren().add(canvas);

Scene scene = new Scene(root, 300, 250);

primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();


Когда я нажимаю на него, он печатает "привет". Когда я нажимаю на него, он печатает "фокус". Когда я нажимаю клавиши, ничего не происходит. Что-то мне не хватает?

спросил(а) 2014-06-09T21:47:00+04:00 6 лет, 3 месяца назад
1
Решение
119

Вам нужно


canvas.setFocusTraversable(true);

в качестве холстов нет focusTraversable по умолчанию.

ответил(а) 2014-06-09T22:36:00+04:00 6 лет, 3 месяца назад
113

Добавьте следующую строку:


canvas.addEventFilter(MouseEvent.ANY, (e) -> canvas.requestFocus());

После того, как вы нажмете на свой холст, холст запросит фокус и распознает ключевые события.

ответил(а) 2014-11-18T12:50:00+03:00 5 лет, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема