IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

Fermer l'interface courante à l'execution d'une autre interface


Sujet :

JavaFX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2013
    Messages : 139
    Par défaut Fermer l'interface courante à l'execution d'une autre interface
    Bonjour,
    J'ai crée deux interface en JavaFX. Je voudrais fermer l'interface courante quand je clic sur un bouton que ouvre l'autre interface.
    J'ai utilisé ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    register_btn.setOnAction(e -> primaryStage.close());
    mais je reçois l'erreur: java.lang.NullPointerExceptionVoila mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    @FXML
    	private Button register_btn;
    public void start(Stage primaryStage) {
    		try {
    			//BorderPane root = new BorderPane();
    			Parent root = FXMLLoader.load(getClass().getResource("Main.fxml"));
    			Scene scene = new Scene(root,1118,628);
    			scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
    			primaryStage.setScene(scene);
    			primaryStage.show();		
     
    			register_btn.setOnAction(e -> primaryStage.close());
    		} 
    		catch(Exception e) {
    			e.printStackTrace();
    		}
    	}
    Pouvez-vous m'aider svp?
    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    Si register_btn est null, ce que tu aurais pu quand même vérifier par toi-même avec un débogueur, c'est probablement que :
    1. tu as oublié de déclarer son fx:id dans le FXML (ou que tu l'as mal écrit en faisant une faute et donc qu'il contient autre chose que "register_btn").
    2. Ou alors c'est que tu as deux instances du contrôleur : celle qui est lancée par la méthode Application.launch() et celle créée automatiquement par FXMLLoader.load(). Or l'injection des variables n'a eut lieu que dans la seconde instance.


    Ici ça semble être l'option 2 (ton application est ton contrôleur donc tu as deux instances créées donc la 1ere a le bouton qui est null puisque l'injection n'a jamais eut lieu).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2013
    Messages : 139
    Par défaut
    Merci pour ta réponse.
    Oui, la valeur de register_btn est null. le bouton fonctionne bien j’exécute la deuxième fenêtre mais j'arrive pas à fermer l'ancienne.
    Je ne sais pas comment résoudre ce problème ...

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    Comme je te lai dit en option 2 tu as sans doute 2 instances de ton contrôleur. Il te faut donc modifier ton code pour n'en avoir qu'une seule. Déjà ça implique de ne plus utiliser la méthode statique (cette méthode est MAL) pour charger le FXML mais d'utiliser la méthode d'instance a la place (cette méthode est BIEN) :

    • Soit injecter l'application comme contrôleur dans le FXML loader :

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("Main.fxml"));
      fxmlLoader.setController(this);
      Parent root = fxmlLoader.load();
      [...]
    • Soit découpler la partie application de la partie contrôleur. Et fournir au contrôleur un callback qu'il invoquera lorsque l'utilisateur clique sur le bouton. C'est un plus au niveau de l'architecture de l'application de bien découpler les rôles même si ça demande un peu plus de boulot.

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      public class A extends Application {
          public void start(Stage primaryStage) {
              try {
                  FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("Main.fxml"));
                  Parent root = fxmlLoader.load();
                  B controller = fxmlLoader.getController();
                  controller.setOnExit(() -> primaryStage.close());
                  Scene scene = new Scene(root,1118,628);
                  scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
      	    primaryStage.setScene(scene);
                  primaryStage.show();		
              } catch(Exception e) {
                  e.printStackTrace();
              }
      }
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      public class B {
          @FXML
          private Button register_btn;
       
          private final ObjectProperty<Runnable> onExit = new SimpleObjectProperty(this, "onExit");
       
          public final void setOnExit(Runnable value) {
              onExit.set(value);
          }
       
          public final Runnable getOnExit() {
              return onExit.get();
          }
       
          public final ObjectProperty<Runnable> onExitProperty() {
              return onExit;
          }
       
          @FXML
          private void onRegister_btn() {
              Optional.ofNullable(getOnExit())
                  .ifPresent(Runnable::run);
          }
      }
      Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      fx:controller="B">
          <Button id="register_btn" fx:id="register_btn" onAction="#onRegister_btn">
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2013
    Messages : 139
    Par défaut
    merci pour ta réponse.
    est ce que je peux affecter deux actions au boutton "register_btn"? (par ce que il ouvre déjà la deuxième fenêtre)
    J'ai un erreur au niveau du fichier FXML quand j'ai ajouté la ligne que tu m'avais dis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
          <Button fx:id="register_btn" layoutX="377.0" layoutY="391.0" mnemonicParsing="false" onAction="#NewDoctor" prefHeight="39.0" prefWidth="193.0" styleClass="register_btn" text="REGISTER">
             <font>
                <Font name="System Bold" size="18.0" />
             </font>
          </Button>
          fx:controller="B">
       	  <Button id="register_btn" fx:id="register_btn" onAction="#onRegister_btn">
          </Button>
    Je reçois:
    javafx.fxml.LoadException:
    .....
    Caused by: java.lang.IllegalArgumentException: Unable to coerce fx:controller="B"> to class javafx.scene.Node.

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    Ben oui c'est normal ton FXML n'est plus un fichier XML valide du coup. L'attribut fx:controller est un attribut de l'élément racine du fichier.

    Non tu peux affecter une seule action à un bouton (donc une seule fonction dans le contrôleur). Mais cette action peut elle invoquer plusieurs fonctions / callback bien sur (autant que tu veux, c'est toi le programmeur, tu fais comme bon te semble).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. Récupérer l'image choisi par l'utilisateur dans une autre interface
    Par sonia06 dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 22/04/2008, 15h53
  2. bouton suivant et passage à une autre interface
    Par Lnmex dans le forum Windows Forms
    Réponses: 8
    Dernier message: 20/08/2007, 12h52
  3. Réponses: 3
    Dernier message: 08/06/2007, 09h50
  4. Fermeture d'interface à partir d'une autre interface
    Par Pingu1 dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 02/05/2007, 12h44
  5. Execution durant une autre fonction
    Par lietof dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/03/2006, 09h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo