【问题标题】:JavaFX fx:id doesn´t create a Object in the controller classJavaFX fx:id 不在控制器类中创建对象
【发布时间】:2019-03-27 17:18:28
【问题描述】:

您好,我是 JavaFX 新手,在使用 fx:id 时遇到问题。

我的控制器类中出现空指针异常。

虽然fx:id 和控制器类中的声明匹配,但不会创建对象applesnake

有人可以帮我吗?

主类:

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);
    }


}

控制器类:

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>

【问题讨论】:

    标签: javafx nullpointerexception fxml


    【解决方案1】:

    控制器实例不与场景关联,除非

    1. 它是由FXMLLoader 基于 fxml 中的fx:controller 属性创建的。在这种情况下,您需要在加载后从用于加载 fxml 的 FXMLLoader 实例中检索控制器实例:

      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();
      

    【讨论】:

    • @Schhelm 如果答案对您有帮助,请接受它作为正确答案。
    • @Sedrick 感谢您的帮助。你能解释一下为什么我必须在 main 方法中单独加载控制器吗?我已经将我的控制器存放在 XML 文件中。 ' 'Buttons' onAction-methods 之前已经工作过。
    • FXMLLoader 基于fx:id#handlerMethod 处理程序使用控制器实例的成员进行注入。 fx:controller="application.Controller" 告诉FXMLLoader 创建application.Controller 的新实例以用作控制器。此实例不同于在您的程序中创建的其他实例。 (即使您两次加载相同的 fxml,也会使用 2 个不同的控制器实例。)使用 FXMLLoader.getController 只允许您检索创建的控制器实例 FXMLLoader
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    相关资源
    最近更新 更多