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 :

recuperer valeur TextField dans 1 fenetre deja existante: pble de loader.load()


Sujet :

JavaFX

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    conducteur autocar
    Inscrit en
    Janvier 2020
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : conducteur autocar
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2020
    Messages : 67
    Points : 34
    Points
    34
    Par défaut recuperer valeur TextField dans 1 fenetre deja existante: pble de loader.load()
    re,

    apres 4j, me revoici

    je cree 1 stage
    fichier Main.java
    fichier FXML_Main.fxml
    fichier CONTROLLER_Main.java

    ma Stage s'affiche:
    dedans 1 TextField
    j'entre 1 valeur

    j'affiche cette valeur ds une nvelle stage
    fichier FXML_F02.fxml
    fichier CONTROLLER_F02.java

    ma stage s'affiche
    dedans 1 TextField
    j'entre 1 valeur
    QUE JE SOUHAITE AFFICHER DS MA PRECEDENTE STAGE

    et là... pfff cata:
    Je comprends pas le coup du loader et des instances du controller

    Un peu de code a propos du CONTROLLER de la stage F02, là ou je peche (profond, tres profond).
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    // ajouté pr permettre d'envoyer la valeur
    	// de F02 vers la fenetre Main
    	public void action_bis() throws IOException {
     
    		System.out.println("action");
     
    		String p_data = getF02_txtF();
    		System.out.print(p_data);
     
    		CONTROLLER_Main ctrl_Main = new CONTROLLER_Main();
     
    		// ???
    		// Parent root = FXMLLoader.load(getClass().getResource("FXML_Main.fxml"));
     
    		// SOIT 
     
    		// ce bloc ensemble
    		FXMLLoader loader_Main = new FXMLLoader();
    		// tu précises le fichier à charger
    		loader_Main.setLocation(Main.class.getResource("FXML_Main.fxml"));
    		// OU
    		// loader_Main.setController(this);
    		// loader_Main.getController();
    		// loader_Main.load();
     
     
    		// SOIT
     
    		// ce bloc
    		// FXMLLoader loader_Main = new FXMLLoader(getClass().getResource("FXML_Main.fxml"));
    		loader_Main.getController();
    		loader_Main.load();
     
     
    		// on a 1 scene
    		System.out.println(F02_lbl02.getScene());
    		// on a 1 stage
    		System.out.println(F02_lbl02.getScene().getWindow());
     
    		// ne peut pas etre resolu
    		// System.out.println(Main_AC.getScene());
     
    		// loader_Main.getController();
     
    		// les 2 fonctionnent qd il n'y a rien en dessous
     
    		// ctrl_Main = loader_Main.load();
    		// ctrl_Main = loader_Main.getController();
     
     
    		// ajout 01
    		// try {
     
    			// tu précises le fichier à charger
    			// loader_Main.setLocation(Main.class.getResource("FXML_Main.fxml"));
     
     
    			// ctrl_Main = loader_Main.load();
    			// ctrl_Main = loader_Main.getController();
     
    		// } catch (IOException except) {
    			// except.printStackTrace();
    		// }
     
    		// ctrl_Main is null
    		ctrl_Main.setLblFromController2(F02_txtF.getText());
     
    		// ctrl_Main is null
    		// ctrl_Main.setLblFromController2(p_data);
     
    		// fonctionne sans les ajouts 01
    		System.out.println(ctrl_Main.test);
     
    		// because the return value of
    		// "application.CONTROLLER_Main.getMain_P()" is null
    		// System.out.println(ctrl_Main.getMain_P().getHeight());
    	}
    DE ce que je comprends
    L11; je cree 1 instance de mon CONTROLLER_Main
    L19: je cree 1 instance de FXMLLoader
    L21: je charge le fichier FXML_Main.fxml ds mon instance de FXMLLoader
    L32 + L33: je peche ms sans appât
    L37 et L39: j'ai 2 "adresses memoire", dc j'ai bien ma scene et ma stage (lesquelles? celles du Main ou celles de F02?)
    L67: j'ai 1 retour console
    java.lang.NullPointerException: Cannot invoke "javafx.scene.control.Label.setText(String)" because "this.lblFromController2" is null

    Voilà,
    j'arrive pas a comprendre l'histoire du loader qui load().
    J'ai essayé plein de trucs au pifometre ms non, je ne comprends pas ce que je dois faire
    re creer stage et scene?
    utiliser le loader.load() correctement? (ms ça je ne sais pas faire).

    Bon, voilà
    si vs pviez me montrer et m'expliquer SVP parce que ce we j'ai bronze grace a mon ecran, pas le soleil...

    En vs remerciant
    grub

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    En général il y a pas vraiment d'intérêt à instancier un contrôleur à mano sauf si c'est pour l'injecter dans un loader derrière.

    Donc oui tu as bien 2 instances du contrôleur, la 1ere servant sans doute a rien et avec tous ses champs @FXML toujours à null/
    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
    Nouveau membre du Club
    Homme Profil pro
    conducteur autocar
    Inscrit en
    Janvier 2020
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : conducteur autocar
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2020
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    Bon déjà,
    merci de tes réponses, on voit bien que t'es hyperactif pr aider les noobs et ca fait plaisir.
    Encore Merci,
    Malheureusement, je ne comprends pas du tt ce que tu vx dire

    En général il y a pas vraiment d'intérêt à instancier un contrôleur à mano
    ou est ce que j'instancie 1 controleur a la mano?
    soit la L11
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CONTROLLER_Main ctrl_Main = new CONTROLLER_Main();
    soit les L19 et 21
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    FXMLLoader loader_Main = new FXMLLoader();
    loader_Main.setLocation(Main.class.getResource("FXML_Main.fxml"));
    En ce qui me concerne
    L11 instancie 1 controleur
    L 19, 21 instancient 1 objet FXMLLoader (qui va charger 1 .fxml, qui va charger 1 Controleur)

    dc que j'instancie a la mano ou pas, je comprends que c'est soit l'1, soit l'autre?

    Ensuite, je vx afficher la valeur d'1 TextField (n'importe quelle valeur en fait, ça ns est égal),
    il faut bien que j'accede a la methode setText de l'objet (widget) qui va afficher cette valeur (setText pr 1 Label ou TextField).
    Et pr ça je dois bien injecter mon controleur ds 1 loader?
    c'est grace au loader que je vais acceder aux proprietes de mes widgets?
    Dc, comment je crée ce fameux loader?

    Désolé d'être lourdaud ms j'ai qd besoin de savoir ce que je fais.

    Merci a toi
    grub

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Citation Envoyé par grub_fr Voir le message
    ou est ce que j'instancie 1 controleur a la mano?
    soit la L11
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CONTROLLER_Main ctrl_Main = new CONTROLLER_Main();
    Ici, puisque tu fais new CONTROLLER_Main().

    Reprenons, généralement pour obtenir une instance d'un controleur, on fera :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    final var loader = new FXMLLoader(....
    final var monNoeud = loader.load();
    final var monController = loader.getControler();
    Bref, un nouveau controleur est instancié et injecté par le loader.


    Moins souvent on fera :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    final var loader = new FXMLLoader(....
    loader.setControler(unControllerQueJavaisDejaAvant);
    final var monNoeud = loader.load();
    Cela permet de réutiliser un contrôleur déjà existant pour peu qu'il soit compatible avec le FXML qu'on charge. Le loader va injecter et initialiser les variables.

    -> si les variables marquées @FXML sont null
    • soit le contrôleur a pas eut d'injection faite par le loader et donc est pas initialisé ;
    • soit le nom des variables correspond pas au valeurs fx:id dans le FXML.
    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
    Nouveau membre du Club
    Homme Profil pro
    conducteur autocar
    Inscrit en
    Janvier 2020
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : conducteur autocar
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2020
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    ok,

    je comprends la logique.
    dc
    ds le controleur de ma derniere fenetre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // tu vas chercher le .fxml de la precedente fenetre
    FXMLLoader loader_Main = new FXMLLoader(getClass().getResource("FXML_Main.fxml"));
    // tu binds (ou tu appaires, parce que binder c'est peut etre autre chose)
    // ton loader (ici loader_Main) avec
    // 1 elt du .fxml de la precedente fenetre
    // CA, CA ME MANQUAIT
    AnchorPane main_AC = (AnchorPane) loader_Main.load();
    // tu crees l'instance du controleur de la precedente fenetre et tu l'"injectes" par le loader
    // cette phrase est encore floue pr moi, va falloir que je l'adapte a ma "logique"
    CONTROLLER_Main ctrl_Main = (CONTROLLER_Main) loader_Main.getController();
    Bref, pr le moment on est tt bon.
    Tu m'as déjà retiré une sacrée epine du pied.
    Un grd merci pour ça.

    Mais là on en revient a la 1° partie du titre de ce post
    recuperer la valeur d'1 TextField de la derniere fenetre pr l'afficher (mettre a jour) ds 1 label de la 1° fenetre

    dc
    1] Par souci de securite j'obtiens 1 instance
    de mon CONTROLLER_F02.java (derniere fenetre) que je mets ds la methode
    initialize() de mon CONTROLLER_Main.java (premiere fenetre)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    FXMLLoader loader_F02 = new FXMLLoader(getClass().getResource("FXML_F02.fxml"));
    //
    try {
    	AnchorPane F02_AC = (AnchorPane) loader_F02.load();
    } catch (IOException e) {
    	e.printStackTrace();
    }
    CONTROLLER_F02 ctrl_F02 = (CONTROLLER_F02) loader_F02.getController();
    ds le CONTROLLER_Main.java (1° fenetre)
    je mets aussi 1 setter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void setLblFromController2(String p_data) {
            lblFromController2.setText(p_data);
    }
    Le setter fonctionne, je l'ai testé

    et enfin, ds le CONTROLLER_F02.java
    je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public void action_bis(ActionEvent event) throws IOException {
            System.out.println("action_bis");
            FXMLLoader loader_Main = new FXMLLoader(getClass().getResource("FXML_Main.fxml"));
    	AnchorPane main_AC = (AnchorPane) loader_Main.load();
    	CONTROLLER_Main ctrl_Main = (CONTROLLER_Main) loader_Main.getController();
            System.out.println("valeur tapée:");
    	System.out.println(F02_txtF.getText());
            ctrl_Main.setLblFromController2(F02_txtF.getText());
    }
    Mais le label de la 1° fenetre ne change pas, ne se met pas a jour
    pourquoi?

    Je continue a chercher de mon côté,
    peut etre que l'appairage devrait se faire ds la méthode initialize(), qque chose comme ça.

    En ts les k, merci pr ton aide.
    Apres ca, je posterai le code complet (en enlevant les T de commentaires), histoire d'etre actif moi aussi (au moins 1x)
    a+
    grub

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Le truc c'est que j'imagine que tu es sensé avoir juste 1 fenêtre principale + son contrôleur. Or, dans le code du second controleur, tu en crées une nouvelle + son contrôleur a elle.

    Tout ce bloc-la

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     FXMLLoader loader_Main = new FXMLLoader(getClass().getResource("FXML_Main.fxml"));
    	AnchorPane main_AC = (AnchorPane) loader_Main.load();
    	CONTROLLER_Main ctrl_Main = (CONTROLLER_Main) loader_Main.getController();
    crée une toute nouvelle instance du contenu de la fenêtre et une toute nouvelle instance du contrôleur. Donc aucun lien avec la fenêtre initiale et le contrôleur initial.

    Plusieurs manières pour faire ce que tu veux :
    PS: je pars du principe que CONTROLLER_F02 est géré depuis CONTROLLER_Main.
    PS2: je tape de mémoire donc il y aura sans doute des erreurs dans le code.

    1. Dans CONTROLLER_F02 mettre une propriété text (nom choisi au pif).


      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      private final ReadOnlyStringProperty textProperty = new ReadOnlyStringWrapper(this, "text", null);
       
      public ReadOnlyStringProperty textProperty() {
          return textProperty.readOnlyProperty();
      }
       
      public String getText() {
          return textProperty.getValue();
      }
      et dans CONTROLLER_Main, on reagit quand la valeur du texte change :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      ctrl_F02.textProperty().addListener((observable, oldValue, newValue) -> {
          setLblFromController2(newValue);
      });
    2. Donner une référence a ctrl_Main dans ctrl_F02Dans CONTROLLER_Main :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ctrl_F02.setMainController(this);
      Dans CONTROLLER_F02 :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      private CONTROLLER_Main mainController;
       
      public void setMainController(CONTROLLER_Main value) {
          this.mainController = value; 
      }
       
      [...]
       
      Optional.ofNullable(mainController)
          .ifPresent(c -> c.setLblFromController2(F02_txtF.getText()));
      Cela permet d'invoquer la bonne méthode sur l'instance du contrôleur principal qui existe déjà, mais cela met un couplage fort entre CONTROLLER_F02 et CONTROLLER_Main.
    3. Il est possible de rendre la chose moins fortement couplée en utilisant des références de méthodes, par exemple:

      Dans CONTROLLER_Main :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ctrl_F02.setOnTextChange(this::setLblFromController2);
      Dans CONTROLLER_F02 :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      private Consumer<String> onTextChange;
       
      public void setOnTextChange(Consumer<String> value) {
          this.onTextChange= value; 
      }
       
      [...]
       
      Optional.ofNullable(onTextChange)
          .ifPresent(c -> c.apply(F02_txtF.getText()));
      Comme ça la boite de dialogue est beaucoup plus générique et on peut la réutiliser ailleurs
    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

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    conducteur autocar
    Inscrit en
    Janvier 2020
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : conducteur autocar
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2020
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    Hello,

    j'ai essayé des... choses
    Je vais rapidement parler des 02 et 03 que tu m'as donné.
    Sympa les bouts de code ms euh, déjà que j'arrive pas a faire des trucs de base, là, rien qu'en les lisant j'ai 4 questions (que je ne vais pas poser, parce que je vais me noyer)
    pr la petite histoire:
    le 02
    en copié-collé me fait des erreurs
    le 03
    en copié collé, ne me fait pas d'erreur ms ne renvoie rien

    dc je me suis mis au 01 qui pr mon niveau est beaucoup plus comprehensible (bien que je n'arrive a rien).

    Désolé ms je vais coller les 2 CONTROLLER.java, peut etre que tu verras ce que je foire
    dc
    CONTROLLER_Main.java
    et
    CONTROLLER_F01.java (anciennement CONTROLLER_F02, j'ai refait 1 projet, histoire de degager les Commentaires, ils etaient + nbreux que les L de code...)

    Je commence par le dernier CONTROLLER, CONTROLLER_F01.java
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    public class CONTROLLER_F01 {
     
    	// ajout modifié
    	private final ReadOnlyStringProperty textProperty = new ReadOnlyStringWrapper(this, "text", null);
    	// private final StringProperty textProperty = new ReadOnlyStringWrapper(this, "text", null);
    	// private final StringProperty textProperty = new SimpleStringProperty();
     
     
    	@FXML
    	private AnchorPane F01_ac;
     
    	@FXML
    	private Pane F01_pane;
     
    	@FXML
    	private TextField F01_txtF;
     
    	@FXML
    	private Button F01_btn;	
     
    	public CONTROLLER_F01() { }
     
    	public void initialize(URL url, ResourceBundle r_bdle) {
     
    	}	
     
    	//------------------------------------------------
    	/*
    	public String get_textProperty() {
    		return textProperty.get();
    	}
    	*/
     
    	/*
    	public void setName(String value) {
    		  ((StringPropertyBase) textProperty).set(value);
    	}
    	*/
     
    	public ReadOnlyStringProperty textProperty() {
    		  return textProperty;
    	}
     
    	public String getText() {
    	    return textProperty.getValue();
    	}
     
    	//------------------------------------------------
    	/*
    	public String getName_textProperty() {
    	    return textProperty.getName();
    	}
    	*/
     
    	/*
    	public String getValue_textProperty() {
    	    return textProperty.getValue();
    	}
    	*/
     
    	public String getEntree() {
    		return F01_txtF.getText();
    	}
    	//------------------------------------------------
    	@FXML
    	public void envoyer() {
     
    		//
    		System.out.println("methode envoyer");
     
    		System.out.println("valeurs de textProperty");
    		System.out.println(textProperty);
    		// retourne les valeurs et attributs de textProperty
     
    		/*
    		System.out.println("valeur de get_textProperty:");
    		String get_textProperty = get_textProperty();
    		System.out.println(get_textProperty);
    		// retourne null
    		*/
     
    		/*
    		System.out.println("valeur de getName_textProperty:");
    		String getName_textProperty = getName_textProperty();
    		System.out.println(getName_textProperty);
    		// retourne "text"
    		*/
     
    		/*
    		System.out.println("valeur de getValue_textProperty:");
    		String getValue_textProperty = getValue_textProperty();
    		System.out.println(getValue_textProperty);
    		// retourne null
    		*/
     
    		System.out.println("la valeur que vs avez tapé:");
    		System.out.println(getEntree());
    		// retourne la valeur tapée
     
    	}
     
    }
    La 1°L (celle que tu m'as donné) fonctionne (Ta "ReadOnlyStringProperty textProperty")
    je suis obligé de "simplifier" en L42 (la methode textProperty), sinon ca ne passe pas.
    la methode getText() passe.
    Sur le blog de ronanlefichant, il en declare 1 + simple que j'ai essayé aussi ms... echec

    j'ai viré les 3 L qui creaient une nvelle fenetre principale: a savoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    FXMLLoader loader_Main = new FXMLLoader(getClass().getResource("FXML_Main.fxml"));
    AnchorPane main_AC = (AnchorPane) loader_Main.load();
    CONTROLLER_Main ctrl_Main = (CONTROLLER_Main) loader_Main.getController();
    et
    CONTROLLER_Main.java
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    public class CONTROLLER_Main implements Initializable {
     
    	private Stage stageF01;
    	private Scene sceneF01;
     
    	private CONTROLLER_F01 ctrl_F01 = new CONTROLLER_F01();
    	private CONTROLLER_Main ctrl_Main;
     
    	@FXML
    	private AnchorPane main_ac;
     
    	@FXML
    	private Label main_lbl;
     
    	@FXML
    	private Button main_btn;
     
    	public CONTROLLER_Main() { }
     
    	public void initialize(URL url, ResourceBundle r_bdle) {
     
    		// ajout
    		ctrl_F01.textProperty().addListener(
    				(observable, oldValue, newValue)
    					-> ctrl_Main.setMain_lbl(newValue));
    					// -> ctrl_Main.imprime("test reimpression")); // n'imprime pas
    					// -> ctrl_Main.imprime(newValue)); // n'imprime pas
     
    		// fonctionne
    		imprime("test impression");
    	}
     
    	// methodes
     
    	public void setMain_lbl(String p_data) {
    		main_lbl.setText(p_data);
    	}
     
    	public void imprime(String p_data) {
    		System.out.println(p_data);
    	}
     
    		 @FXML
    		    public void ouvrirF01(ActionEvent event)  throws IOException {
     
    		    	try {
     
    		    		//
    		    		stageF01 = new Stage();
     
    		    		//
    		    		FXMLLoader loader = new FXMLLoader(getClass().getResource("FXML_F01.fxml"));
     
    		            //
    		            main_ac = loader.load();
     
    		            // 
    		    	   ctrl_F01 = loader.getController();
     
    		            sceneF01 = new Scene(sceneF01Layout);
    		            stageF01.setScene(sceneF01);
     
    		            // permet de rendre la stageF01 modal et de garder le focus
    			    	// stageMain n'est pas utilisable tant que stageF01 est là
    			    	stageF01.initModality(Modality.WINDOW_MODAL);
    			    	stageF01.initOwner(((Node) event.getSource()).getScene().getWindow());
     
    		            // Setup the window/stage
    		            stageF01.setTitle("F01");
     
    		            stageF01.show();
     
    		    	} catch (IOException err) {
     
    		    		//
    		    		err.printStackTrace();
    		    	}
    		    }
    }
    Ds CONTROLLER_Main,
    je mets ton code ds la methode initialize()
    J'imagine que c'est au bon endroit, c'est 1 Listener, tu declares ce genre de choses a l'instanciat° ou initialisat° de qque chose (à la rigueur apres une action ou 1 evenenement).
    Si tu regardes Les 2 L commentées, j'ai essayé d'imprimer qque chose ms pas de retour ds la console.
    Est ce que j'implement correctement cette chose..?

    Je vais continuer 1 peu plus tard ds la soirée ms n'y aurait il pas une histoire de ChangeListener -> cf fabrice-bouye tutoriel? je vais le (re?)lire.

    Merci encore
    a+
    grub

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    conducteur autocar
    Inscrit en
    Janvier 2020
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : conducteur autocar
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2020
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    ok,

    je persiste et signe
    http://https://www.developpez.net/fo...-fichier-fxml/

    Je fais fonctionner son projet, je suis capable d'ajouter des fruits ds la tableView
    ds le fichier mainWindow.fxml, je rajoute:
    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
     
    <Label
    			fx:id="lbl_presente"
    			layoutX="300.0"
    			layoutY="183.0"
    			text="presente" />
    		<Label
    			fx:id="lbl_MAJ"
    			layoutX="300.0"
    			layoutY="227.0"
    			text="defaut" />
    <TextField
    			fx:id="txt_MAJ"
    			layoutX="300.0"
    			layoutY="210.0" />
    ds le fichier MainWindowController.java, je rajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    @FXML
        private Label lbl_presente;
     
        @FXML
        public Label lbl_MAJ;
     
     @FXML
        public TextField txt_MAJ;
    Notez que le second Label est public
    ainsi que le TextField

    fichier dialog.fxml, je ne touche a rien

    fichier DialogController.java, je modifie la methode onAddButtonClicked()
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    @FXML private void onAddButtonClicked(){
            /**
             * Ajout d'un fruit dans la table.
             *
             * mainWindowController.data.add(new Fruit("Kiwi", "Vert"));
             */
     
            /**
             * Mise à jours du label de la fenetre principale pour indiquer un ajout dans la table.
             *
             * mainWindowController.addedFruitLabel.setText(
             *      this.nameEntry.getText().toString()+" "+this.colorEntry.getText().toString()+" a été ajouté.");
             */
     
        	FXMLLoader fl = new FXMLLoader();
     
        	MainWindowController ctrl_MainWindow = new MainWindowController();
        	try {
    			AnchorPane ap = (AnchorPane) fl.load(getClass().getResource("mainWindow.fxml").openStream());
     
     
     
     
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
            	Fruit fr = new Fruit(nameEntry.getText(),colorEntry.getText());    	
            	@SuppressWarnings("unchecked")
            	Stage st = (Stage) addButton.getScene().getWindow();
            	((TableView<Fruit>)((AnchorPane)st.getOwner().getScene().getRoot()).getChildren().get(0)).getItems().add(fr);
            	ctrl_MainWindow = fl.getController();
            	ctrl_MainWindow.lbl_MAJ.setText("test");
     
            	st.close();
        }
    lbl_MAJ ne se met pas a jour...
    Il est public,
    les colonnes de la tableView se mettent a jour, le nveau fruit apparait
    et malgré cela, le Label que je souhaite mettre a jour ne bouge pas
    idem avec 1 TextField

    Honnetement... soit je m'en tiens aux System.out.print(), soit vs me montrez un code qui fonctionne, parce que là... je deviens carrément frustré de ne pas comprendre et dc de ne pas y arriver.

    J'essaierai de donner des nvelles demain ds la soirée, je vais tester d'autres exemples.
    a+
    grub

  9. #9
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Reprenons, mieux vaut un exemple simple que qqun qui essaie de bidouiller encore plus un programme qui ressemble deja fortement a une usine a gaz...

    Programme
    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
    package test.reusedialog;
     
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Scene;
    import javafx.stage.Stage;
    import javafx.scene.Parent;
     
    public final class Main extends Application {
        @Override
        public void start(final Stage stage) throws Exception {
            final var fxmlURL = getClass().getResource("Screen1.fxml");
            final var fxmlLoader = new FXMLLoader(fxmlURL);
            final var content = fxmlLoader.<Parent>load();
            final var scene = new Scene(content);
            stage.setWidth(600);
            stage.setHeight(800);;
            stage.setScene(scene);
            stage.setTitle("Test");
            stage.show();
        }
    }
    Ecran 1
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" encoding="UTF-8"?>
     
    <?import javafx.scene.control.Button?>
    <?import javafx.scene.layout.StackPane?>
     
     
    <StackPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/15.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="test.reusedialog.Screen1Controller">
       <children>
          <Button fx:id="button" mnemonicParsing="false" onAction="#onButton" text="Button" />
       </children>
    </StackPane>

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    package test.reusedialog;
     
    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    import javafx.fxml.Initializable;
    import javafx.scene.Parent;
    import javafx.scene.control.Button;
    import javafx.scene.control.ButtonBar;
    import javafx.scene.control.ButtonType;
    import javafx.scene.control.Dialog;
     
    import java.io.IOException;
    import java.net.URL;
    import java.util.ResourceBundle;
     
    public final class Screen1Controller implements Initializable {
        @FXML
        private Button button;
     
        @Override
        public void initialize(URL url, ResourceBundle resourceBundle) {
     
        }
     
        @FXML
        private void onButton() {
            try {
                final var fxmlURL = getClass().getResource("Dialog1.fxml");
                final var fxmlLoader = new FXMLLoader(fxmlURL);
                final var content = fxmlLoader.<Parent>load();
                final var controller = fxmlLoader.<Dialog1Controller>getController();
                controller.setActionOnTextValidation(this::onValidateText);
                final var window = button.getScene().getWindow();
                final var okButton = new ButtonType("Ok", ButtonBar.ButtonData.OK_DONE);
                final var dialog = new Dialog<>();
                dialog.initOwner(window);
                dialog.setTitle("Dialog");
                dialog.getDialogPane().setContent(content);
                dialog.getDialogPane().getButtonTypes().add(okButton);
                dialog.showAndWait();
     
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
     
        private void onValidateText(final String text) {
            System.out.printf("Text: %s%n", text);
        }
    }
    Dialogue 1
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8"?>
     
    <?import javafx.scene.control.Button?>
    <?import javafx.scene.control.TextField?>
    <?import javafx.scene.layout.AnchorPane?>
     
    <AnchorPane prefHeight="98.0" prefWidth="308.0" xmlns="http://javafx.com/javafx/15.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="test.reusedialog.Dialog1Controller">
       <children>
          <TextField fx:id="textField" layoutX="14.0" layoutY="14.0" prefHeight="25.0" prefWidth="281.0" />
          <Button fx:id="button" layoutX="243.0" layoutY="58.0" mnemonicParsing="false" onAction="#onButton" text="Button" />
       </children>
    </AnchorPane>

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    package test.reusedialog;
     
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.control.Button;
    import javafx.scene.control.TextField;
     
    import java.net.URL;
    import java.util.Optional;
    import java.util.ResourceBundle;
    import java.util.function.Consumer;
     
    public final class Dialog1Controller implements Initializable {
        @FXML
        private Button button;
     
        @FXML
        private TextField textField;
     
        @Override
        public void initialize(URL url, ResourceBundle resourceBundle) {
        }
     
        private Consumer<String> actionOnTextValidation;
     
        void setActionOnTextValidation(Consumer<String> value) {
            actionOnTextValidation = value;
        }
     
        @FXML
        private void onButton() {
            final var text = textField.getText();
            Optional.ofNullable(actionOnTextValidation)
                    .ifPresent(c -> c.accept(text));
        }
    }
    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

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    conducteur autocar
    Inscrit en
    Janvier 2020
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : conducteur autocar
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2020
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    Bon bon bon...

    On est sur 1 forum ecrit, on n'entend pas le ton employé par l'interlocuteur alors sache qu'il n'y a absolument aucune méchanceté, sarcasme ou autre ds ce que je vais ecrire.
    J'admets qd meme que je suis condescendant (soit l'1 soit les 2 en meme temps ;-) )

    1] encore 1x, merci pr ton temps et ton nrj. Je vois les heures ou tu postes tes messages et à cause de tt ça, ca m'embete 1 peu d'ecrire le reste.

    2] ton code, apres 2-3 modifs, fonctionne

    3] as tu bien lu ce que je souhaitais faire?
    A savoir, afficher DANS 1 FENETRE DEJA EXISTANTE la valeur d'1 TextField entrée depuis 1 seconde fenetre (que je fais apparaitre apres la 1°)

    Ton exemple:
    1] ouvre 1 fenetre avec 1 bouton (libellé "Button")
    2] le bouton ouvre 1 seconde fenetre (nommée Dialog) avec 1 TextField, 1 Button (libellé "Button"), 1 Button (libellé "Ok")
    3] j'entre 1 valeur ds le TextField
    --> si je clique sur le Button libellé "Button", la valeur que j'ai entré s'affiche ds la console
    --> si je clique sur le Button libellé "Ok", je ferme la fenetre "Dialog" sans afficher la valeur entrée ds le TextField.

    ça, je sais le faire (j'ai tjs du mal a comprendre la logique structure des fichiers et des loaders ms bon)

    Que dire de +?
    ou j'en suis?
    J'ai mis entre parenthese, en me disant que je vais
    - soit rencontrer le bout de code qui va repondre à ma question au gré de mes prérégrinations
    - soit que je vais etre illuminé par la grâce du ByteCode (faut pas rever)

    j'ai pris le ch.code.makery,
    j'ai francisé a mort et j'ai reproduit le programme mais avec 3 niveaux (fenetres) au lieu de 2 cô il l'a fait.
    j'ai 1 classe Livre et aussi 1 connexion db.
    C'est fonctionnel, je commence a appréhender 2-3 choses.
    Lui, il met les methodes "initFenetreX" ds le Main.java et ds chacune de ces methodes, il y a 1 loader et le getController() qui va avec.

    Il faut que je check les possibilités a mettre des loader ds les fenetres qui st au niveau 2 et 3, voir si j'arrive a les faire communiquer entre elles
    voir si je peux centraliser tt ce qui est méthodes, connexion db et tt (il me semble que c'est du MVC, DAO... oulàlà que de mots, que de maux...)

    Evidemment si le ByteCode peut t'insuffler l'nrj necessaire a produire 1 nvel exemple... dis lui ne ne pas se gêner, autrement... "Vaya con Dios" <<-- Body ds PointBreak il me semble.

    Merci a toi
    grub

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    conducteur autocar
    Inscrit en
    Janvier 2020
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : conducteur autocar
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2020
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    re a tous et toutes,
    re a toi, bouye

    ok, j'y suis arrivé,

    c'est le truc de base,
    y'a 1 MAJ du label a 1 clic bouton

    code et structure de niveau débutant

    y'a possibilité de mettre 1 Listener (ou 1 truc du genre si je dis pas de betise)
    pr la MAJ auto.

    Les attributs st public sinon vs devrez passer par les getter / setter

    faites aussi attentions aux underscores ds le nommage des variables, methodes et appels
    (y'en a pas, y'en a 1, y'en a 2)

    y'a des import qui ne servent a rien, je suis parti de qque chose de deja existant, j'ai pas touché au schmilblick.

    quoi qu'il en soit, voici le code des 5 fichiers.
    c'est commenté et y'a meme des questions que je me pose... (eh oui encore et toujours)

    fichier Main.java
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
     
    package application;
     
    import java.io.IOException;
     
    import javafx.application.Application;
     
    import application.CONTROLLER_Main;
    import application.CONTROLLER_F01;
     
    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Scene;
    import javafx.scene.layout.AnchorPane;
    import javafx.stage.Modality;
    import javafx.stage.Stage;
     
    public class Main extends Application {
     
    	// variables 
     
    	//
    	public Stage FP;
     
    	//
    	public Stage F01;
     
    	//
    	public FXMLLoader loaderFP;
     
    	//
    	public FXMLLoader loaderF01;
     
    	//
    	public CONTROLLER_Main ctrl_FP;
     
    	//
    	public CONTROLLER_F01 ctrl_F01;
     
    	//========================================================
     
        @Override
        public void start(Stage primaryStage) throws Exception {
     
        	init_FP();
        }
     
        //========================================================
     
        //
        public void init_FP() {
     
        	// variables
    		AnchorPane ac_LFP;
    		Scene sceneFP;
     
    		try {
     
    			//
    			FP = new Stage();
     
    			//
    			loaderFP = new FXMLLoader();
    	        loaderFP.setLocation(Main.class.getResource("FXML_Main.fxml"));
    	        ac_LFP = (AnchorPane) loaderFP.load();
     
    	        //
    	        sceneFP = new Scene(ac_LFP);
     
    	        //
    	        FP.setScene(sceneFP);
     
    	        //
    	        FP.setTitle("fenetre principale");
     
    	        //
    	        ctrl_FP = new CONTROLLER_Main();
    	        ctrl_FP = loaderFP.getController();
     
    	        //
    	        ctrl_FP.setMain_(this);
     
    	        //
    	        ctrl_FP.setFP_(FP);
     
    	        //
    	        FP.show();
     
    		} catch(IOException except) {
     
    			//
    			except.printStackTrace();
    		}
     
     
        }
     
        //========================================================
     
        //
        public void initF01() {
     
        	// variables
    		AnchorPane ac_LF01;
    		Scene sceneF01;
     
    		try {
     
    			//
    	    	F01 = new Stage();
     
    	    	//
    			loaderF01 = new FXMLLoader();
    	        loaderF01.setLocation(Main.class.getResource("FXML_F01.fxml"));
    	        ac_LF01 = (AnchorPane) loaderF01.load();
     
    	        //
    	        sceneF01 = new Scene(ac_LF01);
     
    	        //
    	        F01.setScene(sceneF01);
     
    	        //
    	        F01.setTitle("fenetre F01");
     
    	        //
    	        ctrl_F01 = new CONTROLLER_F01();
    	        ctrl_F01 = loaderF01.getController();
     
    	        //
    	        ctrl_F01.setMain__(this);
     
    	        //
    	        ctrl_F01.setF01__(F01);
     
    	        //
    	        F01.show();
     
    		} catch(IOException except) {
     
    			//
    			except.printStackTrace();
     
    		}
     
        }
     
      //========================================================
     
    	// GETTER DE LA FP
    	public Stage getFP() {
     
    		//
    		return FP;
     
    	}
     
    	//========================================================
     
    	// GETTER DE LA F01
    	public Stage getF01() {
     
    		//
    		return F01;
     
    	}
     
        //========================================================
     
        public static void main(String[] args){
            Application.launch(Main.class, (java.lang.String[]) null);
        }
    }
    fichier FXML_Main.fxml
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <?import javafx.scene.control.Button?>
    <?import javafx.scene.control.Label?>
    <?import javafx.scene.layout.AnchorPane?>
    <?import javafx.scene.layout.Pane?>
     
    <AnchorPane
    	fx:id="main_ac"
    	prefHeight="300.0"
    	prefWidth="1000.0"
    	xmlns="http://javafx.com/javafx/18"
    	xmlns:fx="http://javafx.com/fxml/1"
    	fx:controller="application.CONTROLLER_Main">
    	<children>
    		<Pane
    			fx:id="main_p"
    			prefHeight="300.0"
    			prefWidth="1000.0"
    			AnchorPane.bottomAnchor="0.0"
    			AnchorPane.leftAnchor="0.0"
    			AnchorPane.rightAnchor="0.0"
    			AnchorPane.topAnchor="0.0">
    			<children>
    				<Label
    					fx:id="main_lbl"
    					layoutX="103.0"
    					layoutY="179.0"
    					text="txt par defaut" />
    				<Button
    					fx:id="main_btn"
    					layoutX="4.0"
    					layoutY="31.0"
    					mnemonicParsing="false"
    					onAction="#ouvrirF01"
    					text="ouvrir" />
    				<Button
    					fx:id="btn_recevoir_valeur"
    					layoutX="80.0"
    					layoutY="150.0"
    					mnemonicParsing="false"
    					onAction="#MAJ_valeur"
    					text="recevoir valeur" />
    				<Label text="1: ouvrez la prochaine fenetre, tapez 1 valeur ds le TextField, revenez ici et cliquez sur recevoir valeur pr MAJ le label" />
    				<Label
    					layoutX="15.0"
    					layoutY="77.0"
    					text="Vs avez entré 1 valeur ds le TextField de la seconde fenetre, cliquez sur le btn pr MAJ le label ci-dessous" />
    			</children>
    		</Pane>
    	</children>
    </AnchorPane>
    fichier CONTROLLER_Main.java
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
     
    package application;
     
    import application.Main;
    import application.CONTROLLER_F01;
     
    import java.io.IOException;
    import java.net.URL;
    import java.util.ResourceBundle;
     
    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    import javafx.fxml.Initializable;
    import javafx.scene.Node;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.Label;
    import javafx.scene.layout.AnchorPane;
    import javafx.scene.layout.Pane;
    import javafx.stage.Modality;
    import javafx.stage.Stage;
    import javafx.beans.value.ChangeListener;
     
    public class CONTROLLER_Main implements Initializable {
     
    	// variables
     
    	//
    	public Main main_;
     
    	//
    	public Stage FP_;
     
    	//========================================================
     
    	@FXML
    	private AnchorPane main_ac;
     
    	@FXML
    	private Pane main_p;
     
    	@FXML
    	public Label main_lbl;
     
    	@FXML
    	private Button main_btn;
     
    	@FXML
    	private Button btn_recevoir_valeur;
     
    	//========================================================
     
    	// constructeur
    	public CONTROLLER_Main() { }
     
    	//========================================================
     
    	public Label getMain_lbl() {
    		return main_lbl;
    	}
     
    	public void setMain_lbl(Label main_lbl) {
    		this.main_lbl = main_lbl;
    	}
     
    	//========================================================
     
    	public void initialize(URL url, ResourceBundle r_bdle) { }
     
    	//========================================================
     
    	// methodes
     
    	// appellée depuis
    	// fichier: Main.java
    	// methode: init_FP()
     
    	// ref a l'application principale
    	// ??? la fenetre principale???
    	// alors pourquoi la méthode en dessous?
    	public void setMain_(Main p_main) {
    		this.main_ = p_main;
    	}
     
    	//========================================================
     
    	// appellée depuis
    	// fichier: Main.java
    	// methode: init_FP()
     
    	// ref a la fenetre principale???
    	// quelle difference avec l'application principale?
    	public void setFP_(Stage p_stage) {
    		this.FP_ = p_stage;
    	}
     
    	//========================================================
     
    	@FXML
    	private void ouvrirF01() {
     
    		//
    		main_.initF01();
     
    	}
     
    	//========================================================
     
    	// MAJ le label au clic bouton
    	// on peut faire 1 MAJ auto avec 1 Listener
    	// (oldValue -> new Value)
    	public void MAJ_valeur() {
     
    		//
    		String valeur_recue = main_.ctrl_F01.getF01_txtF().getText();
     
    		//
    		System.out.println("valeur recue: " + valeur_recue);
     
    		//
    		main_lbl.setText(valeur_recue);
     
     
    	}
     
    }
    fichier FXML_F01.fxml
    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
    25
    26
    27
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <?import javafx.scene.control.Button?>
    <?import javafx.scene.control.TextField?>
    <?import javafx.scene.layout.AnchorPane?>
    <?import javafx.scene.layout.Pane?>
     
     
    <AnchorPane
    	fx:id="F01_ac"
    	xmlns:fx="http://javafx.com/fxml/1"
    	xmlns="http://javafx.com/javafx/18"
    	fx:controller="application.CONTROLLER_F01">
    	<children>
    		<Pane
    			fx:id="F01_pane"
    			prefHeight="200.0"
    			prefWidth="200.0">
    			<children>
    				<TextField
    					fx:id="F01_txtF"
    					layoutY="24.0" />
    			</children>
    		</Pane>
    	</children>
    </AnchorPane>
    fichier CONTROLLER_F01.java
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    package application;
     
    import application.Main;
    import application.CONTROLLER_Main;
     
    import java.io.IOException;
    import java.net.URL;
    import java.util.Optional;
    import java.util.ResourceBundle;
    import java.util.function.Consumer;
     
    import javafx.beans.property.ReadOnlyStringProperty;
    import javafx.beans.property.ReadOnlyStringWrapper;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.beans.property.StringProperty;
    import javafx.beans.property.StringPropertyBase;
    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.control.Button;
    import javafx.scene.control.TextField;
    import javafx.scene.layout.AnchorPane;
    import javafx.scene.layout.Pane;
    import javafx.stage.Stage;
     
    public class CONTROLLER_F01 {
     
    	// variables
     
    	//
    	public Main main__;
     
    	//
    	public Stage F01__;
     
    	//========================================================
     
    	@FXML
    	private AnchorPane F01_ac;
     
    	@FXML
    	private Pane F01_pane;
     
    	@FXML
    	private TextField F01_txtF;
     
    	//========================================================
     
    	// constructeur(s)
    	public CONTROLLER_F01() { }
     
    	//========================================================
     
    	public TextField getF01_txtF() {
    		return F01_txtF;
    	}
     
    	public void setF01_txtF(TextField f01_txtF) {
    		F01_txtF = f01_txtF;
    	}
     
    	//========================================================
     
    	//
    	public void initialize(URL url, ResourceBundle r_bdle) { }
     
    	//========================================================
     
    	// appellée depuis
    	// fichier: Main.java
    	// methode: initF01()
     
    	// ref a l'application principale
    	// ??? la fenetre principale???
    	// alors pourquoi la méthode en dessous?
    	public void setMain__(Main p_main) {
    		this.main__= p_main;
    	}
     
    	//========================================================
     
    	// appellée depuis
    	// fichier: Main.java
    	// methode: initF01()
    	public void setF01__(Stage p_stage) {
    		this.F01__ = p_stage;
    	}
     
    	//========================================================
    }
    Je passe en RESOLU,
    Bonne fin de we a vous
    Bonne fin de we a toi, bouye, MErci encore pr le temps passé.

    grub

  12. #12
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Alors, je rappelle que :

    1. Mon but n'est pas de faire ton exercice / TP / stage / boulot a ta place.
    2. Mon but est de t'apprendre des méthodes simples et des astuces simples de développement que tu pourras intégrer puis modifier et étendre dans une solution applicable dans ton projet.
    3. Il nous est impossible de comprendre correctement votre soucis (et donc de vous aider) si vous n’êtes pas capables de vous exprimer de manière simple et précise avec un français correct.
    4. Quand on essaie de modifier un projet complexe ou existant, on isole le soucis et on reproduit un test simple et reproductible démontrant le soucis, car, entre autres, :
      • ça évite de divulguer du code ou des secrets d'entreprise.
      • ça évite que tu bousilles le code d'un projet certes mal foutu mais qui est sensé fonctionner en l’état en testant des trucs dedans.
      • De plus cela peut te permettre de mieux organiser tes pensées et ce que tu comprennes mieux de ton projet et donc parfois de trouver la solution par toi-même.
      • Ça permet d'aller a l'essentiel, et ça évite que la personne qui va lire ton code passe des heure a lire des tas de lignes inutiles et sans aucun rapport avec ton soucis.
    5. De la même manière, vous êtes encouragés a poster des sujets séparés pour des problèmes différents au lieu de faire un sujet fourre-tout qui fait 3km de long.
    6. On vous aide sur notre temps libre, on est pas payé pour ça.
    7. La terre est ronde, le décalage horaire ça existe : le milieu de la nuit pour une personne peut être le début de l’après-midi pour une autre. Certains ont aussi des horaires de travail ou de vie nocturnes.


    Et il me semble que le code que je t'ai donné permettait justement de récupérer la valeur texte saisi dans une boite de dialogue "Dialogue 1" dans la 1ere fenêtre "Ecran 1" (sauf que moi je l'ai affiché dans la console au lieu de l'afficher dans la GUI) démontrant ainsi que "Dialogue 1" peut transmettre sa valeur a "Ecran 1" sans pour autant être fortement liée a cette classe (ce qui permet d'ailleurs de réutiliser "Dialogue 1" dans d'autres contextes sans avoir "Ecran 1" derrière).
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. recuperer valeur formulaire dans VB
    Par PC81 dans le forum IHM
    Réponses: 2
    Dernier message: 13/05/2008, 11h04
  2. [VB.NET] Recuperation valeur selectionnee dans COMBOBOX
    Par stephane77fr dans le forum Windows Forms
    Réponses: 2
    Dernier message: 30/07/2007, 17h43
  3. [XSLT]Recuperer valeur concatenee dans une balise
    Par e_peigne dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 25/10/2006, 13h49
  4. [VB6 ArcView9] Recuperer valeur RMS dans une variable
    Par TiT0f dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 23/05/2006, 15h49
  5. recuperer valeur liste dans champs texte
    Par fredaphp dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/05/2006, 19h17

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