2017-02-28 3 views
0

J'ai un FXML qui décrit mon IUG. Je veux changer le texte de l'interface graphique et démarrer une tâche sur n'importe quelle touche n'importe où.Ajout écouteur d'événement à l'aide mainScene à JavaFX FXML

FXML

<Text fx:id="barcodeText"/> 

Contrôleur

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

Cela me donne un NullPointerException (à l'intérieur JavaFX fil Application) pour le pointeur barcodeText quand je déclenche l'événement.

Est-ce que je fais quelque chose de mal?

Les exemples que je avons examinés en utilisant cette approche sans FXML, dois-je utiliser une annotation pour définir le gestionnaire? où est-ce que je mettrais "onAction" pour la scène dans le fxml?

+0

'@FXML Texte textBox,' 'ou @FXML Texte barcodeText;'? – pzaenger

+1

Le chargeur de FXML '@ champs initialise de FXML' annoté dans le * contrôleur *, pas dans l'instance de la classe' 'Application' sur laquelle start' est appelé. Donc, 'barcodeText' (ou' textBox', ou tout ce que vous avez vraiment appeliez) sera nulle dans le 'Application' exemple. –

+0

@pzaenger désolé, qui était une faute de frappe –

Répondre

2

(A part: il semble que vous essayez d'utiliser la même classe pour le contrôleur, et pour l'application Don't do that..)

Définition d'une méthode dans la classe de contrôleur pour régler le texte du code à barres:

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

Ensuite, appelez cette méthode de votre gestionnaire:

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

de toute évidence, remplacer MyControllerClass par le nom réel du contrôleur classe.

+0

Merci, résolu mon problème. Je vais également prendre l'indice et le contrôleur séparé de l'application. –