JavaFX fx: id не создает объект в классе контроллера - PullRequest
0 голосов
/ 23 октября 2018

Здравствуйте, я новичок в JavaFX и у меня проблемы с fx:id.

Я получаю исключение нулевого указателя в моем классе контроллера.

Объекты apple и snakeне создаются, хотя объявления fx:id и в классе контроллера совпадают.

Может кто-нибудь мне помочь?

Main-Class:

public class Main extends Application {


    private Controller controll = new Controller();

    @Override
    public void start(Stage primaryStage) {
        try {
            Parent root = FXMLLoader.load(getClass().getResource("World2.fxml"));
            Scene scene = new Scene(root);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            scene.setOnKeyPressed(controll);
            primaryStage.setScene(scene);

            primaryStage.show();


        } catch(Exception e) {
            e.printStackTrace();
        }
    }

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


}

Controller-Class:

public class Controller implements EventHandler<Event> {

    @FXML
    private ImageView snake;
    @FXML
    private ImageView apple;

    private int snakeRow = 8;
    private int snakeColumn = 10;
    private int appleRow = 5;
    private int appleColumn = 5;

    @Override
    public void handle(Event ev) {

        KeyEvent event = (KeyEvent) ev;

        System.out.println("handle-Methode");

        if (event.getCode() == KeyCode.LEFT && snakeColumn > 0) {
            snakeColumn--;

            System.out.println("Snake-ID: " + snake);
            System.out.println("Apple-ID: " + apple);

        }
    }

FXML:

   <ImageView fx:id="apple" fitHeight="39.0" fitWidth="44.0" pickOnBounds="true" GridPane.columnIndex="5" GridPane.rowIndex="5">
         <image>
            <Image url="@../img/icons8-apfel-48.png" />
         </image>
     </ImageView>
    <ImageView fx:id="snake" fitHeight="36.0" fitWidth="44.0" pickOnBounds="true" GridPane.columnIndex="10" GridPane.rowIndex="8">
       <image>
          <Image url="@../img/icons8-hydra-48.png" />
       </image>
    </ImageView>

1 Ответ

0 голосов
/ 23 октября 2018

Экземпляр контроллера не связан со сценой, если только

  1. Он создан FXMLLoader на основе атрибута fx:controller в fxml.В этом случае вам нужно будет извлечь экземпляр контроллера из экземпляра FXMLLoader, используемого для загрузки fxml после загрузки:

    FXMLLoader loader = new FXMLLoader(getClass().getResource("World2.fxml"));
    Parent root = loader.load();
    Controller controll = loader.getController();
    

    или

  2. Вы не можетеНе указывайте атрибут fx:controller, но перед загрузкой укажите Object в FXMLLoader, который будет использоваться в качестве контроллера для сцены:

    FXMLLoader loader = new FXMLLoader(getClass().getResource("World2.fxml"));
    loader.setController(controll);
    Parent root = loader.load();
    
...