2017-10-14 36 views
0

J'utilise le code ci-dessous pour transmettre l'information, mais j'aimerais connaître d'autres façons. Dans la méthode de gestionnaire d'événement handleSubmitButtonAction de FXMLDocumentController, je crée une autre fenêtre chargeant le fichier MainFXML. Après cela, je reçois son contrôleur et envoie mes informations à la fenêtre principale. Y a-t-il une meilleure façon de faire cela?Quel est le meilleur moyen de transmettre des informations entre les fenêtres de JavaFX?

public class FXMLDocumentController implements Initializable { 

    @FXML 
    private TextField user; 

    @FXML 
    public void handleSubmitButtonAction(ActionEvent event) throws IOException { 
     Alert dialogo = new Alert(Alert.AlertType.INFORMATION, "User: " + user.getText() + " logged in."); 
     dialogo.showAndWait(); 
     Stage stage2 = (Stage) user.getScene().getWindow(); 
     stage2.close(); 

     FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("MainFXML.fxml"));   
     Parent root = (Parent) fxmlLoader.load(); 
     MainFXMLController controller = fxmlLoader.<MainFXMLController>getController();   

     Scene scene = new Scene(root); 
     Stage stage = new Stage(); 
     stage.setScene(scene); 
     stage.show(); 

     controller.setUser(user.getText());   
    } 
+0

Utilisation de l'application en tant qu'instance singleton "controller" dans le sens MVC? Pas joli, mais découble entre les classes de contrôleur FX. –

+0

Je voudrais savoir quel serait le meilleur moyen. Chaque application javafx est MVC dans sa nature en raison du fichier fxml, non? –

+0

La meilleure façon est juste une opinion. Tout le monde peut avoir des opinions différentes. Ainsi, vous pourriez obtenir de nombreuses réponses différentes en fonction des opinions différentes et vous ne seriez pas plus près de déterminer la meilleure façon. Quoi qu'il en soit, IMO, si c'est une grande application, utilise un mécanisme d'injection de dépendances, comme [Gluon Ignite] (http://gluonhq.com/labs/ignite/), rend les objets injectés JavaFX beans avec des propriétés observables et a vos éléments d'interface utilisateur lié ou écouter les changements sur les propriétés. Mais, d'un autre côté, la solution que vous avez dans votre question pourrait être la meilleure pour vous, vous décidez. – jewelsea

Répondre

1

Essayer de donner une réponse courte.

Ce que je fais est que je crée un "modèle d'application" des classes de contrôleur. La racine du modèle d'application est bien sûr le contrôleur de la classe Application. Le modèle d'application ne fuit pas les éléments de l'interface graphique, mais indique au programme principal d'être refermable, ayant changé, etc.

public abstract class Part { 
     public final ObservableMap<String, ActionHandler> getActionHandlers() {...}  
     public final ObservableBooleanValue closableProperty() {...} 
     public final ReadOnlyBooleanProperty disabledProperty() {...} 
     .... 
} 

public abstract class ViewPart extends Part { 
     public final StringProperty titleProperty() { ... } 
     public final ReadOnlyObjectProperty<Image> iconProperty() { ... } 
     .... 
} 

public abstract class Editor extends Part { 
     public final ObservableBooleanValue dirtyProperty() { .... } 
} 

Comme dans Eclipse ces parties peuvent avoir leur propre fenêtre, mais ils ont pas nécessairement, ils peuvent aussi être intégré dans une autre fenêtre. Cette modélisation est basée librement sur la structure d'Eclipse.