2017-02-28 8 views
0

私のGUIを記述するfxmlがあります。私はguiのテキストを変更し、どこでもキープレスでタスクを開始したいと思います。fxmlを使ってJavafxのmainSceneにイベントリスナーを追加

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ポインタのための(JavaFXのアプリケーションスレッド内)NullPointerExceptionを与えます。

何か間違っていますか?

私が調べた例では、fxmlを使用しないでこのアプローチを使用していましたが、ハンドラを定義するためにアノテーションを使用する必要がありますか?どこでfxmlにシーンの "onAction"を置くのですか?

+0

'@FXMLテキストテキストボックス;または' @FXMLテキストバーコードテキスト; '? – pzaenger

+1

FXMLローダは、 'start'が呼び出された' Application'クラスのインスタンスではなく、*コントローラ*の '@ FXML'アノテーション付きフィールドを初期化します。ですから、 'barcodeText'(または' textBox'など)は、 'Application'インスタンスではnullになります。 –

+0

@pzaenger申し訳ありませんが、それはタイプミスです。 –

答えて

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を置き換えますクラス。

+0

ありがとう、私の問題を修正しました。私は、ヒントとアプリケーションからコントローラを分離します。 –

関連する問題