使用fxml将事件侦听器添加到Javafx中的mainScene

时间:2017-02-28 15:20:11

标签: java javafx fxml eventhandler

我有一个描述我的gui的fxml。我想改变gui的文本,并在任何按键的任何地方开始任务。

FXML

<Text fx:id="barcodeText"/>

控制器

   @FXML
   Text barcodeText;

   public void start(Stage primaryStage) throws IOException {
        this.primaryStage=primaryStage;
        Scene mainScene =new Scene(root);
        primaryStage.setScene(mainScene);
        primaryStage.setResizable(false);
        primaryStage.show();
        Parent root = FXMLLoader.load(getClass().getResource("/view/foo.fxml"));
        mainScene.addEventHandler(KeyEvent.KEY_PRESSED,new KeyboardEventHandler(){
                @Override
                public void handle(KeyEvent event) {
                   barcodeText.setText("foo");
                }
        });

当我触发事件时,这为barcodeText指针提供了NullPointerException(在JavaFX应用程序内部)。

我做错了吗?

我看到的例子是在没有fxml的情况下使用这种方法,我是否必须使用注释来定义处理程序?我会在哪里放置&#34; onAction&#34;对于fxml中的场景?

1 个答案:

答案 0 :(得分:2)

(旁白:看起来你试图为控制器和应用程序使用相同的类。Don't do that.

在控制器类中定义一个用于设置条形码文本的方法:

public void setBarcodeText(String barcode) {
    barcodeText.setText(barcode);
}

然后从你的处理程序调用该方法:

FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/foo.fxml"));
Parent root = loader.load();

MyControllerClass controller = loader.getController();

Scene mainScene = new Scene(root);
mainScene.addEventHandler(KeyEvent.KEY_PRESSED, new KeyboardEventHandler(){
        @Override
        public void handle(KeyEvent event) {
            controller.setBarcodeText("foo");
        }
});

显然,将MyControllerClass替换为控制器类的实际名称。