Как установить KeyEvent на сцене для объекта, определенного в FXML?

Я хочу создать очень простую программу - прямоугольник, управляемый клавишами со стрелками. Вот как выглядит мой файл FXML:

<Group  fx:controller = "default.Controller" xmlns:fx = "http://javafx.com/fxml" >
    <Rectangle fx:id = "object" width = "20" height = "30" />
</Group>

А теперь я хочу добавить KeyEvent к этому object. Однако, когда я делаю это внутри метода initialize() таким образом: object.getScene().setOnKeyPressed(...), я получаю исключение с нулевым указателем.

Я искал, но не мог найти способ получить объект Scene внутри контроллера. Есть простой способ сделать это?

У вас нет доступа к сцене в FXML, и у вас нет доступа к ней в контроллере, если он не находится в обработчике событий (пользовательский интерфейс, определенный в FXML, не может быть добавлен в сцену, когда метод initialize() называется). Добавьте обработчик ключевого события в сцену в том месте, где вы создаете сцену (метод start() или где-то еще), и вызовите метод на контроллере (или модели) из обработчика.

James_D 01.05.2018 17:36

@James_D Вы имеете в виду, что я должен создать дескриптор статического контроллера в классе Main (я создаю сцену в классе Main), а затем добавить это событие в класс Main следующим образом: scene.setOnKeyPressed(event -> controllerInstance.method());?

LaTeXEnthusiast 01.05.2018 17:40

Зачем вам делать что-нибудь static в этом сценарии? Разве вы не загружаете FXML в класс Main?

James_D 01.05.2018 17:40
Controller controllerInstance = (Controller) loader.getController();, где loader - мой FXMLLoader - вы это имели в виду?
LaTeXEnthusiast 01.05.2018 17:42

Да, вот так получается ссылка на контроллер.

James_D 01.05.2018 17:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
36
0

Другие вопросы по теме