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

avec Java Discussion :

Classes et références


Sujet :

avec Java

  1. #1
    Invité
    Invité(e)
    Par défaut Classes et références
    Bonjour, voilà je suis en train de me mettre au langage objet après quelque années de dev WEB en PHP. J'ai fait un ptit projet avec trois classes : la classe de démarrage (Main), une classe Form (MyFrame extends JFrame) et une classe de capture d'action (MyButton extends AbstractAction).
    J'ai créé un bouton sur ma Form avec en passage de paramètre un instance de l'objet de capture :
    Dans l'objet Form :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jButton1 = new javax.swing.JButton(new MyButton(this,prog,"Valider"));
    Dans l'objet action :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public MyButton(MyFrame fenetre,Main prog,String texte){
                super(texte);
                this.prog=prog;
                this.fenetre=fenetre;
            }
    Et j'aimerais donc que lorsque l'on clic sur le bouton, ça exécute une fonction située dans ma classe de démarrage :
    Dans l'objet action :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void actionPerformed(ActionEvent e) { 
                prog.calcul(fenetre);
    	}
    J'espérais donc passer l'objet de démarrage à l'objet form et que celui repasse cette référence ainsi que la sienne a l'objet action, mais l'objet de démarrage étant static, il ne peut pas se passer en paramètre lors de l'instanciation de l'objet form (
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyFrame fenetre = new MyFrame(this);
    ).
    J'aurais donc aimé savoir s'il existait un moyen dans ma classe MyForm de récupérer l'objet qui l'à appelé (Main) un peu du genre MyForm.opener.
    J'ai privilégié le partage des traitements comme le préconise certain ( interface graphique, traitements, gestion des evenements), mais je suis encore gauche quant à l'illustration de ce modèle, donc hésitez pas à m'aiguiller sur une/des méthode de travail en environnement Objet/GDI.
    En espérant avoir était assez clair, merci !

  2. #2
    Membre averti Avatar de welcome_59
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 203
    Points : 352
    Points
    352
    Par défaut
    ça me semble inutiliement compliqué ce que tu essaie de faire (ou alors j'ai mal compris). Tu dois savoir qu'en Java tu as 2 types de méthodes: de classe (static) et d'instance (non static). Pour invoquer une méthode de classe, tu dois avoir accès à la classe et pour une méthode d'instance il te faut posséder une référence à l'instance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    monInstance.maMethode()
    .
    Pour exécuter une méthode suite au clic sur un bouton, voici une méthode simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class MaFrame extends JFrame {
      private JButton bouton;
      public MaFrame() {
        this.bouton = new JButton("Bouton");
        this.bouton.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent ae) {
            //ici le code que tu veux exécuter
          }
        });
      }
    }
    Les méthodes que tu offrirais dans Main seraient (en général) je suppose des méthodes statiques
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Main {
      public static void main(String[] args) {
        //création et lancement de la frame
      }
     
      public static void methodeStatique() {
        //Code de la méthode
      }
    }
    Pour appeler methodeStatique au clic:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class MaFrame extends JFrame {
      private JButton bouton;
      public MaFrame() {
        this.bouton = new JButton("Bouton");
        this.bouton.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent ae) {
            Main.methodeStatique();
          }
        });
      }
    }

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci, il et vrai que je n'avais pas pensé au faite qu'une méthode static pouvez etre appelée hors d'une instance. Mais mon problème c'est que la méthode que je veux appelé n'est pas statique, elle récupère des saisies faite sur l'objet form (TextField,ComboBox).
    Mais je suis en train de me demander s'il ne serait plus judicieux de créer une classe spécifique pour ma fonction ? En gros créer une classe qui manipulerait d'autre classe.
    Vas vraiment falloir que je me remettes au vocabulaire objet moi

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bon, je suis passé par une classe de manipulation (je suis sur que ca porte un nom, mais je remets pas le doigt dessus).
    Par contre j'ai un autre petit problème, je passe par des classes d'abstraite pour les actions (cf Tuto swing de Baptiste Wicht):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class MyButton extends AbstractAction{
    public MyButton(String texte){
           super(texte);
    }
    public void actionPerformed(ActionEvent e) { 
           /* mon magnifique code */
    }
    }
    Qui sont appelée lors de la création de l'objet final:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jButton1 = new javax.swing.JButton(new MyButton("Valider"));
    Alors ca fonctionne nickel pour les objet de type button, menuitem, textfield, mais je n'arrive pas à l'implémenter sur un objet de type combobox.
    Si je mets mon instance directement sur la ComboBox, j'ai une erreur comme quoi la classe n'existe pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lsttaux = new javax.swing.JComboBox(new MyItem(this,"Taux"));
    donne :
    NetBeansProjects\Respawn\src\respawn\MyFrame.java:32: cannot find symbol
    symbol : constructor MyItem(respawn.MyFrame,java.lang.String)
    location: class respawn.MyItem
    lsttaux = new javax.swing.JComboBox(new MyItem(this,"Taux"));
    1 error
    et si j'essaye d'instancier mon objet action sur chaque item de la liste, rien ne se passe (çà ça doit etre normal je pense).
    Enfin voilà quoi je tourne un peu en rond là.

  5. #5
    Membre averti Avatar de welcome_59
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 203
    Points : 352
    Points
    352
    Par défaut
    Je pense que ton problème est surtout la clarté de ton besoin et la conception de ton application.
    Clarté du besoin
    essaie de préciser le but de ton programme
    Conception
    Ne réinventes pas la roue:
    public class MyButton extends AbstractAction{
    public MyButton(String texte){
    super(texte);
    }
    public void actionPerformed(ActionEvent e) {
    /* mon magnifique code */
    }
    }
    MyButton définit une classe qui ne t'apporte aucune fonctionnalité supplémentaire par rapport à l'API de base.
    Conseil: avant de créer une classe, cherche dans l'API de base si une classe offrant les fonctionnalités que tu recherches n'existe pas déjà. Dans ton cas, la classe JButton (et bien d'autres) feraient l'affaire.
    Concernant l'erreur
    NetBeansProjects\Respawn\src\respawn\MyFrame.java:32: cannot find symbol
    symbol : constructor MyItem(respawn.MyFrame,java.lang.String)
    location: class respawn.MyItem
    lsttaux = new javax.swing.JComboBox(new MyItem(this,"Taux"));
    1 error
    il semble que tu ne respectes pas la signature du constructeur de la classe MyItem. Est-ce que tu pourrais poster le code complet de la classe?

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/08/2011, 13h19
  2. Classes et références
    Par Dom_the_quaker dans le forum Langage
    Réponses: 2
    Dernier message: 16/12/2009, 11h56
  3. Affectation de classe de référence.
    Par label55 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 19/02/2009, 15h09
  4. Passage de classes par références ?
    Par octal dans le forum Langage
    Réponses: 3
    Dernier message: 18/01/2007, 16h05
  5. Build-Path / Class-Path : Référence entre projets
    Par JohnNC dans le forum Langage
    Réponses: 1
    Dernier message: 17/01/2007, 14h03

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