2017-03-01 1 views
0

Je suis nouveau sur JavaFX. Essayer de suivre un tutoriel pour générer une scène et associer eventhandler avec un bouton. J'ai créé un fichier Main.FXML et l'ai modifié dans SceneBuilder. Depuis que j'ai ajouté le chemin de SceneBuilder dans mon IDE, il est capable de détecter mon contrôleur principal. J'ai écrit une fonction pour générer un nombre aléatoire.JavaFX: LoadException résout onAction pour le gestionnaire d'événements d'un bouton

public class MainController { 

    public static void generateRandom(ActionEvent event) { 
     Random rand = new Random(); 
     int myrand = rand.nextInt(500) + 1; 
     System.out.print(Integer.toString(myrand)); 
    } 
} 

En scenebuilder, il détecte cette méthode dans le contrôleur qui peut être facilement ajouté que eventhandler pour OnAction du bouton. Main.FXML est mis à jour après les opérations.

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.layout.AnchorPane?> 


<AnchorPane prefHeight="300" prefWidth="500" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.111" fx:controller="application.MainController"> 
    <children> 
     <Button layoutX="204.0" layoutY="204.0" mnemonicParsing="false" onAction="#generateRandom" text="Button" /> 
     <Label layoutX="138.0" layoutY="36.0" prefHeight="144.0" prefWidth="210.0" /> 
    </children> 
</AnchorPane> 

Ma principale classe d'application est comme ci-dessous:

public class Main extends Application { 
    @Override 
    public void start(Stage primaryStage) throws IOException { 
     Parent root = FXMLLoader.load(getClass().getResource("/application/Main.fxml")); 
     Scene scene = new Scene(root,400,400); 
     scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 
     primaryStage.setTitle("My Title"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

    } 

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

Quand je lance l'application, je suis arrivé erreur:

javafx.fxml.LoadException: Error resolving onAction='#generateRandom', either the event handler is not in the Namespace or there is an error in the script. /C:/Users/Oscar/Workspace/Sunoco/bin/application/Main.fxml:10

Error resolving “onAction” while loading FXML suggère qu'il peut avoir à faire avec mauvaise importation pour ActionEvent ce qui n'est pas le cas. De plus, tout est configuré automatiquement avec SceneBuilder et Eclipse. Alors pourquoi ai-je cette erreur?

Répondre

2

Je pense que le problème sera résolu si vous utilisez une annotation @FXML sur le eventmethod. En outre, essayez de ne pas rendre les méthodes statiques dans le contrôleur, car cela peut être déroutant/trompeur. Si vous avez besoin que cette méthode soit accessible d'ailleurs, pensez à la déclarer dans une classe séparée (utilitaire).

+0

On dirait que 'static' pose problème. Après l'avoir sorti, il a fonctionné sans l'annotation '@ FXML'. – ddd