2017-10-09 4 views
0

Je suis nouveau sur javaFx, et j'ai trouvé seulement dans la fonction @fxml et la fonction initialize le champ @fxml n'est pas nul sinon le champ @fxml sera toujours nul, est-ce vrai? Si oui, comment puis-je utiliser un champ de @fxml immédiatement après que je charge un FXML (ne pas utiliser la recherche), comme ça? (Le suivi de code jetteront une exception null)JavaFx-when fxml injecter un champ d'objet?

@FXML Label resultTF; 
    .... 
    FXMLLoader loader=new FXMLLoader(); 
    loader.setController(this); 

    Parent pane = loader.load(getClass().getResource("/fxml/Main.fxml")); 
    this.resultTF.setText(""); 

Tout ce que je veux faire est de déclarer un champ avec id dans le fxml, et l'utiliser immédiatement après charger le fxml, quelque chose comme wpf, flex

+0

désolé, c'est une erreur, j'ai édité le code – BlackCat

+0

Ok, je sais ce qui se passe maintenant, la méthode de chargement que j'appelle est une méthode statique.Parce qu'elle a le même nom avec la charge statique, donc je n'ai pas se rendre compte que, donc je pense que java peut appeler la méthode statique d'une instance est un mauvais design :) – BlackCat

Répondre

2

Vous appelez la méthode statique FXMLLoader.load(URL).

Comme il s'agit d'une méthode statique, il ne sait rien de l'instance que vous utilisez pour l'invoquer (ce qui est une mauvaise pratique de toute façon, votre IDE devrait émettre un avertissement à ce sujet). Plus précisément, il n'a pas de jeu de contrôleurs.

Vous devez appeler un instance load() method, par ex.

FXMLLoader loader=new FXMLLoader(); 
loader.setController(this); 
loader.setLocation(getClass().getResource("/fxml/Main.fxml")); 

Parent pane = loader.load(); 
+0

wow, je ne me suis pas rendu compte que c'était une méthode statique, car il a le même nom avec la méthode de l'objet. – BlackCat

+0

merci beaucoup – BlackCat

+0

@BlackCat Oui, ce n'est pas une conception d'API particulièrement bonne; Cependant, comme je l'ai dit, votre EDI devrait signaler cela et vous suggérer de le changer à l'équivalent 'FXMLLoader.load (getClass(). getResource (...))'. –

-1

Vous pouvez spécifier le contrôleur dans le fichier FXML. Le FXMLLoader va initialiser les variables dans le contrôleur. Dans ce cas, il n'y a pas de problème avec votre code. C'est une bonne pratique de séparer le contrôleur de la classe principale.

+1

Il n'y a rien dans l'OP qui suggère que le contrôleur est le même que la classe principale, cependant. Il y a beaucoup de modèles dans lesquels vous chargeriez le FXML à partir du contrôleur, par ex. voir https://docs.oracle.com/javase/9/docs/api/javafx/fxml/doc-files/introduction_to_fxml.html#custom_components –

+0

Le code donne cette impression. –

+0

Comment ça? Vous devez supposer que le code est dans la "classe principale" (ce qui ne devrait vraiment pas être le cas, la classe principale ne devrait gérer que le cycle de vie de l'application). Le PO dit qu'il essaye d'imiter wpf et/ou flex, ce qui, je pense, tend à utiliser des conceptions de type MVVM (bien que je ne sois pas un expert dans ces technologies). Dans cette conception, vous souhaitez charger la vue depuis le contrôleur. –