JavaFX FXML contrôleur - constructeur vs méthode initialize
Mon Application
classe ressemble à ceci:
public class Test extends Application {
private static Logger logger = LogManager.getRootLogger();
@Override
public void start(Stage primaryStage) throws Exception {
String resourcePath = "/resources/fxml/MainView.fxml";
URL location = getClass().getResource(resourcePath);
FXMLLoader fxmlLoader = new FXMLLoader(location);
Scene scene = new Scene(fxmlLoader.load(), 500, 500);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
La FXMLLoader
crée une instance de la manette correspondante (donnée dans la FXML
fichier via fx:controller
) en invoquant d'abord le constructeur par défaut et puis le initialize
méthode:
public class MainViewController {
public MainViewController() {
System.out.println("first");
}
@FXML
public void initialize() {
System.out.println("second");
}
}
La sortie est:
first
second
Alors, pourquoi ne le initialize
méthode existe pas? Quelle est la différence entre l'utilisation d'un constructeur ou le initialize
méthode pour initialiser le contrôleur de choses nécessaires?
Merci pour vos suggestions!
Vous devez vous connecter pour publier un commentaire.
En quelques mots: Le constructeur est appelé en premier, puis tout
@FXML
annoté les champs sont remplis, puisinitialize()
est appelé. Si le constructeur n'a PAS accès à@FXML
champs relatifs aux éléments définis dans la .fichier fxml, tandis queinitialize()
n'ont accès à eux.Citant le Introduction au FXML:
FXMLLoader
, droit? Donc je ne vois pas un avantage dans l'attente duinitialize()
- méthode. Dès que le FXML est chargé, le code suivant a accès à la@FXML
variables. Bien sûr, il le fait dans la méthode start et pas dans le constructeur, mais seraitinitialize()
apporter aucun avantage dans son cas?La
initialize
méthode est appelée après tout@FXML
annoté membres ont été injectés. Supposons que vous avez une vue de la table que vous souhaitez remplir avec les données:En Plus les réponses ci-dessus, il y a sans doute convient de noter qu'il existe un héritage façon de mettre en œuvre la phase d'initialisation. Il y a une interface appelée Initializable du fxml bibliothèque.
Paramètres:
Et la note de la docs pourquoi la manière la plus simple de l'utilisation de
@FXML public void initialize()
travaux:NOTE
Cette interface a été remplacé par injection automatique de l'emplacement et les ressources des propriétés dans le contrôleur. FXMLLoader va automatiquement appeler n'importe quel dûment annoté pas-arg méthode initialize() définie par le contrôleur. Il est recommandé que l'approche d'injection être utilisé chaque fois que possible.