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 :

Acceder à un object qui se trouve dans une autre classe


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 105
    Points : 56
    Points
    56
    Par défaut Acceder à un object qui se trouve dans une autre classe
    Bonjour,

    je croyais avoir reglé un problème en rajoutant des "static" à des objets que j'avais crée pour pouvoir y acceder librement à travers une autre classe mais je me suis rendu compte qu'en fermant la fenetre en question, si je la reouvrais, les deux elements en question n'avait pas varié... vous allez me dire que c'est normal certes...

    je voulais savoir quelles sont les diverses méthodes, pour que lorsque l'on a 2 classes (eventuellement 2 jframe), à partir d'une action sur l'une, on puisse engendrer une modification (dans mon cas un repaint) sur un ou plusieurs composants de l'autre.

    J'avais pensé au static, mais ce n'est apparemment pas viable et je ne vois pas comment faire, merci pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut Re: Acceder à un object qui se trouve dans une autre classe
    Salut,

    Citation Envoyé par ceres02
    je croyais avoir reglé un problème en rajoutant des "static" à des objets que j'avais crée pour pouvoir y acceder librement à travers une autre classe mais je me suis rendu compte qu'en fermant la fenetre en question, si je la reouvrais, les deux elements en question n'avait pas varié... vous allez me dire que c'est normal certes...
    Il vaut éviter d'utiliser directement des éléments statiques à tout bout de champs, car cela n'est pas très "propre" du point de vu POO...

    Citation Envoyé par ceres02
    je voulais savoir quelles sont les diverses méthodes, pour que lorsque l'on a 2 classes (eventuellement 2 jframe), à partir d'une action sur l'une, on puisse engendrer une modification (dans mon cas un repaint) sur un ou plusieurs composants de l'autre.
    Le plus simple est de passer la référence du second objet à ton premier via une méthode mutateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private JFrame secondaryFrame = null;
     
    public void setSecondaryFrame(JFrame frame) {
    	this.secondaryFrame = frame;
    }


    Sinon si ton action correspond à un "événément", tu peux te créer ton propre listener (voir la FAQ pour plus de détail sur ce point : Comment créer son propre Listener ?)


    a++

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 105
    Points : 56
    Points
    56
    Par défaut
    Le plus simple est de passer la référence du second objet à ton premier via une méthode mutateur :
    Code:
    private JFrame secondaryFrame = null;

    public void setSecondaryFrame(JFrame frame) {
    this.secondaryFrame = frame;
    }
    J'ai un peu de mal a voir ce que ca fait et le contexte dans lequel je devrais la placer.

    Sinon, en attendant une réponse, j'ai effectivement pensé au listenner, le creer, c'est une chose que je vais etudier de pret mais encore une fois, dans, j ai du mal à le placer dans mon contexte.

    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
    public class okAction implements java.awt.event.ActionListener {
               public void actionPerformed(java.awt.event.ActionEvent e) {
                   if(horlConfigEnable==true) {
                            if(highField.getText().equals("") || lowField.getText().equals("") || iniOff.getText().equals("") || benchField.getText().equals("") 
                            || pasField.getText().equals("")) {
                                JOptionPane.showMessageDialog(null, "Toutes les données n'ont pas été inscrites", "Erreur", JOptionPane.ERROR_MESSAGE);
                            }
                            else { pas=Integer.parseInt(pasField.getText());
                                   dureeSimuInitiale=Integer.parseInt(benchField.getText());
                                   System.out.println(pas);
                                   System.out.println(dureeSimuInitiale);
                                   dispose();
                                 }
                   }
                   else {
                            if(benchField.getText().equals("") || pasField.getText().equals("")) {
                                JOptionPane.showMessageDialog(null, "Toutes les données n'ont pas été inscrites", "Erreur", JOptionPane.ERROR_MESSAGE);   
                            }
                            else { pas=Integer.parseInt(pasField.getText())*Rule.TEMPS;
                                   dureeSimuInitiale=Integer.parseInt(benchField.getText())*Rule.TEMPS;
                                   //FenetreSimulation.columnView.repaint();
                                   //FenetreSimulation.chronogramme.repaint();
                                   dispose();
                                 }
                  }
            }
        }
    Voila j'ai deux classes FenetreSimulation et FenetreWizard, le code provient du bouton OK de FenetreWizard, à l'issu duquel je souhaite repaint deux éléments de FenetreSimulation.

    J'ai pensé, si c'est possible mettre un stateListenner sur les deux variables dureeSimu et pas et lorsqu'elles sont modifées, repaint() les deux elements mais ou est ce que je dois placer ce listenner?

    Merci

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 105
    Points : 56
    Points
    56
    Par défaut
    Bonjour,

    j'ai l'impression de tourner en rond avec ce problème et je suis sur que ce que je veux faire est courant dans un GUI en java.
    Je ne dois vraiment pas avoir la bonne approche pour le problème en question. Est ce que adiGuba ou quelqu'un d'autres pourrait m'apporter sa lumière ? :o

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 105
    Points : 56
    Points
    56
    Par défaut
    Bon j'ai trouvé une solution, même si j'alimente moi meme ce thread
    Pour ceux eventuellement que ca interesse et surtout pour valider la propreté de ma démarche.

    J'ai crée un 2nd ActionListenner sur le bouton OK de ma FenetreWizard mais cette fois-ci dans la class FenetreSimulation.
    Cela donne :

    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
     
        public class wizardAction implements ActionListener {
              public void actionPerformed(ActionEvent e) {
                  FenetreWizard wizardFrame = new FenetreWizard();
                  wizardFrame.okBouton.addActionListener(new okBoutonWizardListener());
           }
        }
     
        // Ecoute le bouton de la FenetreWizard, si une action est effectue sur ce bouton,
        // cela veut dire que les nouvelles valeurs ont ete rentrees et columnView ainsi que
        // chronogramme ont besoin d etre repaint().
        public class okBoutonWizardListener implements ActionListener {
     
            public void actionPerformed(ActionEvent e) {
                      chronogramme.repaint();
                      columnView.repaint();
            }
        }
    Voila, maintenant est-ce comme ca qu'il faut proceder en temps normal ? ou existe t il une methode plus propre ?

    Merci.

  6. #6
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    C'est une solution effectivement.
    Tu peux aussi utiliser un Dialog plutôt qu'une frame pour ton wizard ce qui permet de récupérer une valeur de retour plus facilement.

    Perso j'ai une applic avec plusieurs fenêtres qui utilisent des infos communes, j'ai mis alors un objet dans le contexte applicatif, une sorte de globale. Je met ensuite des listeners sur les propriétés de cet objet.
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  7. #7
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 105
    Points : 56
    Points
    56
    Par défaut
    C'est une solution effectivement.
    Tu peux aussi utiliser un Dialog plutôt qu'une frame pour ton wizard ce qui permet de récupérer une valeur de retour plus facilement.
    Comment cela ?

    Perso j'ai une applic avec plusieurs fenêtres qui utilisent des infos communes, j'ai mis alors un objet dans le contexte applicatif, une sorte de globale. Je met ensuite des listeners sur les propriétés de cet objet.
    Oui alors, ca j'y ai pensé mais c'est un objet que tu mets en en contexte applicatif ?

    Pour mes deux variables defSimuEntree et pas, elles sont statiques, j'ai pensé ajouter un listener pour controller en permanence leur evolution mais il n'y a pas de listener de int, non ?

    Il aurait fallu que je crée mon propre listener ?

    Merci

  8. #8
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Citation Envoyé par ceres02
    Tu peux aussi utiliser un Dialog plutôt qu'une frame pour ton wizard ce qui permet de récupérer une valeur de retour plus facilement.
    Comment cela ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MonDialog monDial = new MonDialog();
    int res = monDial.show();
    if (res == JOptionPane.OK_OPTION) {
        repaintAll();
    }
    Citation Envoyé par ceres02
    Oui alors, ca j'y ai pensé mais c'est un objet que tu mets en en contexte applicatif ?
    Ouich.

    Citation Envoyé par ceres02
    Pour mes deux variables defSimuEntree et pas, elles sont statiques, j'ai pensé ajouter un listener pour controller en permanence leur evolution mais il n'y a pas de listener de int, non ?
    Perso j'utilise le DataBinding avec JGoodies. Ca permet d'avoir des objets qui étendent la classe "Model" de JGoodies sur lesquels tu peux mettre des écouteurs d'événements pour chaque propriété, peu importe leur type. Exemple d'objet :

    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
    public class MonObjet extends Model {
     
    	public static final String PROPERTYNAME_ID = "id";
     
    	protected int id;
     
    	public int getId() {
    		return this.id;
    	}
     
    	public void setId(int id) {
    		int oldValue = getId();
    		this.id = id;
    		firePropertyChange(PROPERTYNAME_ID, oldValue, id);
    	}
     
    }
    Il suffit alors de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    monObjet.addPropertyChangeListener(MonObjet.PROPERTYNAME_ID, new PropertyChangeListener() {
        public void propertyChange(PropertyChangeEvent evt) {
            System.out.println("L'id a changé : " + evt.getOldValue() + " => " + evt.getNewValue());
        }
    });
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  9. #9
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 105
    Points : 56
    Points
    56
    Par défaut
    Merci beaucoup pour ces précieux conseils,

    je vais tenter d'appliquer le databinding, car c'est de loin la méthode la plus directe pour faire ce que je souhaite.
    Avec ma methode, je ne fais que surveiller le bouton d'un component et non la valeur en tant que tel, en tout cas, c est bon à savoir !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/03/2012, 10h21
  2. Réponses: 1
    Dernier message: 30/07/2010, 14h39
  3. Appeler une fonction qui se trouve dans une autre fonction
    Par waxouse dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 11/05/2009, 16h28
  4. Réponses: 2
    Dernier message: 02/04/2008, 19h55
  5. appler un controle qui se trouve dans une autre form
    Par mstic dans le forum Windows Forms
    Réponses: 18
    Dernier message: 06/05/2007, 19h11

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