2017-07-25 4 views
1

J'ai quelques scènes dans mon projet Java et un problème que je ne sais vraiment pas comment résoudre. First scene called "Zadanie". Il existe TextFields et ComboBox dans cette première scène appelée "Zadanie". Donc, comme vous pouvez le voir dans l'image, j'ai écrit des nombres dans TextFields et j'ai choisi quelques options dans ComboBoxes. Puis j'ai allumé une autre scène en cliquant sur "Vypočítať" (bouton en haut). Et puis je suis revenu sur la première scène "Zadanie", mais tout dans TextFields et ComboBoxes est parti. Back on first scene "Zadanie". S'il vous plaît donnez-moi un exemple de code ou quelque chose comment garder ceux dans la première scène. Je vous remercie.Java - Scene Builder - L'entrée utilisateur dans TextField et ComboBox disparaît après avoir changé de scène

+0

Pouvez-vous s'il vous plaît poster un code qui reproduit le problème? S'il vous plaît voir https://stackoverflow.com/help/how-to-ask –

Répondre

0

Le problème est que lorsque vous changez d'écran, l'objet qui représente l'écran est éliminé. Ainsi, toutes les variables telles que la saisie par l'utilisateur sont également éliminées. lorsque vous revenez à l'écran, c'est un objet différent mais du même type. Cela signifie que les valeurs des variables telles que l'entrée de l'utilisateur sont fraîchement instanciées/initialisées.

Solution: Créez des variables globales (par exemple, des variables dans Main, mais vous devez utiliser différentes classes pour l'apprentissage des pratiques de programmation) qui stockent ces informations. Lorsque l'utilisateur clique pour passer d'un écran à l'autre, mais avant que l'écran ne soit réellement commuté (déchargé), stockez n'importe quelle entrée utilisateur dans les variables globales. Puis, lorsque l'écran est rétabli, rechargez ces variables dans les champs à partir des variables globales.

Global.java

class Global { 
    public static String nameFieldValue; 
    public static String ageFieldValue; 
} 

PersonForm.java

class PersonForm extends BorderPane { 
    Button closeButton; 
    TextField nameField; 
    TextField ageField; 

    public PersonForm() { 
     this.nameField = new TextField(...); 
     this.ageField = new TextField(...); 
     this.closeButton = new Button("Close Window"); 

     // set layouts of buttons here. 

     if (Global.nameFieldValue != null) { 
      this.nameField.setText(Global.nameFieldValue); 
     } 
     if (Global.passwordFieldValue != null) { 
      this.passwordField.setText(Global.passwordFieldValue); 
     } 

     PersonForm thisForm = this; // So that EventHandler cna use this. 
     this.closeButton.setOnAction(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent event) { 
       Global.nameFieldValue = thisForm.nameField.getText(); 
       Global.passwordFieldValue = thisForm.passwordField.getText(); 
       // switch screens. 
      } 
     }); 
    } 
} 
+0

Merci pour votre aide, mais pourriez-vous me donner un exemple écrit dans le code? Ce serait utile. –

+0

J'apprécie vraiment que vous m'avez aidé avec le code aussi, mais je l'ai fait d'une autre manière. De mon deuxième écran j'ai fait l'écran instantané. Cela signifie que lorsque vous cliquez sur le bouton, le deuxième écran s'ouvre mais le premier ne se ferme pas. Je vais certainement utiliser votre code la prochaine fois à cause de mon éducation. Merci Ian Kirkpatrick. –

+0

Pas de problème! Heureux de vous aider! –