Я хочу создать очень простую программу - прямоугольник, управляемый клавишами со стрелками. Вот как выглядит мой файл 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 внутри контроллера. Есть простой способ сделать это?
@James_D Вы имеете в виду, что я должен создать дескриптор статического контроллера в классе Main (я создаю сцену в классе Main), а затем добавить это событие в класс Main следующим образом: scene.setOnKeyPressed(event -> controllerInstance.method());
?
Зачем вам делать что-нибудь static
в этом сценарии? Разве вы не загружаете FXML в класс Main
?
Controller controllerInstance = (Controller) loader.getController();
, где loader
- мой FXMLLoader - вы это имели в виду?
Да, вот так получается ссылка на контроллер.
У вас нет доступа к сцене в FXML, и у вас нет доступа к ней в контроллере, если он не находится в обработчике событий (пользовательский интерфейс, определенный в FXML, не может быть добавлен в сцену, когда метод
initialize()
называется). Добавьте обработчик ключевого события в сцену в том месте, где вы создаете сцену (методstart()
или где-то еще), и вызовите метод на контроллере (или модели) из обработчика.