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

AWT/Swing Java Discussion :

Changer la valeur d'un Champ d'une fenètre à partir d'une autre classe


Sujet :

AWT/Swing Java

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 606
    Par défaut Changer la valeur d'un Champ d'une fenètre à partir d'une autre classe
    Bonjour,

    Je ne comprends pas très bien comment changer la valeur d'un JTextField jtf à partir d'une autre classe classe1.
    Les deux classes sont dans le même package.

    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
     
    public class classe1 {
     
             public static void main(String[] args) {
                           new Fenetre();
                           je mets un mot dans le champ jtf 
             }
     
     
    }
    ------------------------------------------------------------------------------
    public class Fenetre {
     
            private JFrame frame;
            private JTextField jtf;
     
     
    	public FenetreDeConnection() {
    		initialize();
    	}
     
    	private void initialize() {
     
    		frame = new JFrame();
    		frame.setBounds(...);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.getContentPane().setLayout(null);
     
    		jtf = new JTextField();
    		jtf.setText("rien");
     
                   frame.setVisible(true);
     
    }

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Il te faut simplement un accesseur sur le JTextField :

    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
    public class Fenetre {
     
            private JFrame frame;
            private JTextField jtf;
     
     
    	public FenetreDeConnection() {
    		initialize();
    	}
     
    	private void initialize() {
                    /** ... **/
            }
     
            public JTextField getField() {
                   return jtf; 
            }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class classe1 {
     
             public static void main(String[] args) {
                           Fenetre fenetre = new Fenetre();
                           fenetre.getField().setText("un mot");// je mets un mot dans le champ jtf 
             }
     
    }
    Si tu veux qu'on ne puisse pas toucher au champ lui-même (ou masque le fait que ça soit un JTextField) :

    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
    public class Fenetre {
     
            private JFrame frame;
            private JTextField jtf;
     
     
    	public FenetreDeConnection() {
    		initialize();
    	}
     
    	private void initialize() {
                    /** ... **/
            }
     
            public void setFieldText(String text) {
                   return jtf.setText(text);
            }
     
            public String getFieldText() {
                   return jtf.getText();
            }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class classe1 {
     
             public static void main(String[] args) {
                           Fenetre fenetre = new Fenetre();
                           fenetre.setFieldText("un mot");// je mets un mot dans le champ jtf 
             }
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 606
    Par défaut
    Bonjour,

    Et si par exemple j'ai trois classes.
    La classe 1 appelle la classe 2 qui génère la fenêtre . La classe 1 génère la classe 3 c3 car elle utilise des méthodes de cette classe.
    Et la classe 2 utilise la classe 3 pour échanger des données.
    Si dans la classe 3 je fais un new Classe 2, bein ca va me générer la fenêtre, j'en aurai deux ainsi. Une générer par la classe 1 et l'autre par la classe 3

    Ce serai bien de mettre un setter dans la classe 3 ? qui fait :
    classe2 c2;
    public void setC2(classe2 c2) { this.c2 = c2}

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class classe1 {
     
            classe3 c3 ;
             ... 
             public static void main(String[] args) {  new Fenetre(c3);  }
     
     
    }
    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
     
    public class Fenetre {
     
            private JFrame frame;
            private JTextField jtf;
            Classe3 c3
     
    	public FenetreDeConnection(classe3 c3) {
                    this.c3 = c3 ;
    		initialize();
                    c3.setC2(this);
    	}
     
            public JTextField getField() { return jtf;}
            public String setField(String s){ jtf.setText(s); }
     
     
    	private void initialize() {
     
    		frame = new JFrame();
                    ...
                    JTextField jtf = new JTexTField
    		jtf.setText("rien");
     
                   y a un bouton quand t-on appuie dessue ca lance methode
     
                   frame.setVisible(true);
     
     
           }
     
          private void methode {   c3.méthode }
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class classe3{
     
           Classe2 c2
     
           public void setC2(classe2 c2) { this.c2 = c2}
            ...
            public void methode() {  
               c2.setField("Modif"); //  je modifie le champ jtf de la classe fenetre
           }
     
     
    }

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Si ton interface se compléxifie, tu peux passer par un modèle. Il n'y a qu'une référence à connaître : celle du modèle. Les composants qui ont besoin d'information du modèle se branchent dessus pour savoir quand la valeur change, et y accèdent directement au besoin et quand ils n'en ont plus besoin se débranchent. Il n'y a pas de liens dans tous les sens, et il n'y a jamais à se poser la question de savoir s'il y a un composant au bout du lien, ni à passer plein de références. Ajouter un nouveau composant n'impacte pas les composants déjà crées. Les évenements sont gérés sur l'EDT, donc on peut se servir du modèle comme d'un composant Swing niveau accès aux informations (par exemple dans un SwingWorger si on à besoin de communiquer avec une base de données dans un process long).

    Par exemple :
    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
    import java.beans.PropertyChangeListener;
     
    import javax.swing.event.SwingPropertyChangeSupport;
     
    public class DataModel {
     
    	public static final String PROP_NOM = "nom";
    	public static final String PROP_PRENOM = "prénom";
     
    	final SwingPropertyChangeSupport support = new SwingPropertyChangeSupport(this);
     
    	private String nom;
    	private String prenom;
     
    	public void setNom(String nom) {
    		String old = this.nom;
    		this.nom=nom;
    		support.firePropertyChange(PROP_NOM, old, nom);
    	}
     
    	public String getNom() {
    		return nom;
    	}
     
    	public void setPrenom(String prenom) {
    		String old = this.prenom;
    		this.prenom=prenom;
    		support.firePropertyChange(PROP_PRENOM, old, prenom);
    	}
     
    	public String getPrenom() {
    		return prenom;
    	}
     
    	public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
    		support.addPropertyChangeListener(propertyName, listener);
    	}
     
    	public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
    		support.removePropertyChangeListener(propertyName, listener);
    	}
     
    }
    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
     
    public class Fenetre1 extends JFrame {
     
    	public Fenetre1(DataModel datamodel) {
    		super("FENETRE 1");
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		JPanel panel = new JPanel(new GridBagLayout());
    		GridBagConstraints gbc = new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.BASELINE, GridBagConstraints.NONE, new Insets(2, 2, 2, 2), 0, 0);
    		panel.add(new JLabel("Nom : "), gbc);
    		gbc.gridy=1;
    		panel.add(new JLabel("Prénom : "), gbc);
     
    		JTextField fieldPrenom = new JTextField();
    		gbc.gridx=1;
    		gbc.weightx=1;
    		gbc.fill=GridBagConstraints.HORIZONTAL;
    		panel.add(fieldPrenom, gbc);
     
    		JTextField fieldNom = new JTextField();
    		gbc.gridy=0;
    		panel.add(fieldNom, gbc);
     
    		PropertyChangeListener nomChangeListener = e-> fieldNom.setText(datamodel.getNom());
    		PropertyChangeListener prenomChangeListener = e-> fieldPrenom.setText(datamodel.getPrenom());
    		datamodel.addPropertyChangeListener(DataModel.PROP_NOM, nomChangeListener);
    		datamodel.addPropertyChangeListener(DataModel.PROP_PRENOM, prenomChangeListener);
     
    		fieldNom.setText(datamodel.getNom());
    		fieldNom.addActionListener(e-> datamodel.setNom(fieldNom.getText()));
     
    		fieldPrenom.setText(datamodel.getPrenom());
    		fieldPrenom.addActionListener(e-> datamodel.setPrenom(fieldPrenom.getText()));
     
    		addWindowListener(new WindowAdapter() {
    			public void windowClosed(java.awt.event.WindowEvent e) {
    				datamodel.removePropertyChangeListener(DataModel.PROP_NOM, nomChangeListener);
    				datamodel.removePropertyChangeListener(DataModel.PROP_PRENOM, nomChangeListener);
    			};
    		});
     
    		add(panel);
    		pack();
    		setLocationRelativeTo(null);
     
    	}
     
    }
    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
    public class Fenetre2 extends JFrame {
     
    	public Fenetre2(DataModel datamodel) {
    		super("FENETRE 2");
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		JPanel panel = new JPanel(new GridBagLayout());
    		GridBagConstraints gbc = new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(2, 2, 2, 2), 0, 0);
    		panel.add(new JLabel("Nom : "), gbc);
     
    		JTextField fieldNom = new JTextField();
    		gbc.gridx=1;
    		gbc.weightx=1;
    		gbc.fill=GridBagConstraints.HORIZONTAL;
     
    		panel.add(fieldNom, gbc);
     
    		PropertyChangeListener nomChangeListener = e-> fieldNom.setText(datamodel.getNom());
    		datamodel.addPropertyChangeListener(DataModel.PROP_NOM, nomChangeListener);
     
    		fieldNom.setText(datamodel.getNom());
    		fieldNom.addActionListener(e-> datamodel.setNom(fieldNom.getText()));
     
    		addWindowListener(new WindowAdapter() {
    			public void windowClosed(java.awt.event.WindowEvent e) {
    				datamodel.removePropertyChangeListener(DataModel.PROP_NOM, nomChangeListener);
    			};
    		});
     
    		add(panel);
    		pack();
    		setLocationRelativeTo(null);
     
    	}
     
    }
    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
    public class Program {
    	public static void main(String[] args) {
     
    		DataModel dataModel = new DataModel();
    		dataModel.setNom("Truc");
    		dataModel.setPrenom("Machin");
     
    		Fenetre1 fenetre1 = new Fenetre1(dataModel);
    		Fenetre2 fenetre2 = new Fenetre2(dataModel);
     
    		Rectangle bounds = fenetre2.getBounds();
    		bounds.setLocation(bounds.x+fenetre1.getWidth(),bounds.y);
    		fenetre2.setBounds(bounds);
     
    		fenetre1.setVisible(true);
    		fenetre2.setVisible(true);
     
    		dataModel.addPropertyChangeListener(DataModel.PROP_NOM, e-> System.out.println("Valeur nom changée : "+e.getOldValue()+"->"+e.getNewValue()));
    		dataModel.addPropertyChangeListener(DataModel.PROP_PRENOM, e-> System.out.println("Valeur prénom changée : "+e.getOldValue()+"->"+e.getNewValue()));
     
    	}
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 606
    Par défaut
    Merci de votre aide.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/08/2015, 16h56
  2. Réponses: 7
    Dernier message: 22/06/2012, 12h12
  3. Réponses: 0
    Dernier message: 14/05/2012, 17h27
  4. Réponses: 11
    Dernier message: 06/12/2005, 08h23
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24

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