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

Langage Java Discussion :

classe interne à declarer final


Sujet :

Langage Java

  1. #1
    Membre actif
    Inscrit en
    Janvier 2003
    Messages
    604
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 604
    Points : 247
    Points
    247
    Par défaut classe interne à declarer final
    Bonjour, je suis en train de voir ce que l'on peut faire avec les Threads
    et j'ai ajouté rapidement une interface graphique pour voir ce qui se passait lorsque je lancais un Thread à la main au milieu d'autre que j'avais lancé par programme.

    Donc j'ai vite fait, une interface graphique avec un bouton qui appel un objet (en l'occurence un Thread), mais là ca bloque à la compilation sur un probleme de classe interne. Alors que ma classe unObjet est une classe à l'exterieur de la premiere et qui est compilée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    C:\Java\ObjetThread>javac unObjet.java
    unObjet.java:58: local variable obj2 is accessed from within inner class; needs
    to be declared final
      obj4 = new unObjet("obj4");
      ^
    unObjet.java:59: local variable obj2 is accessed from within inner class; needs
    to be declared final
      obj4.start();
      ^
    2 errors
    Je mets le code du main()
    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
     
    public static void main(String args[])
    {
      unObjet obj1;
      unObjet obj2;
      monObjet obj4;
      obj1 = new unObjet("obj1");
      obj2 = new unObjet("obj2");
      obj1.start();
      obj2.start();
      JFrame uneFrame = new JFrame("test");
      JPanel unJpanel = new JPanel();
      uneFrame.setContentPane(unJpanel);
      JButton lebouton = new JButton("interruption");
      unJpanel.add(lebouton);
     
      uneFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
      uneFrame.pack();
      uneFrame.setVisible(true);
      lebouton.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e) 
      {
      obj4 = new monObjet("obj4");
      obj4.start();
      }});
      }
     
    }
    D'avance merci de vos idées

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    940
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 940
    Points : 1 817
    Points
    1 817
    Par défaut
    Placez public void actionPerformed(ActionEvent e) à l'extérieur de main.

  3. #3
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par BugFactory
    Placez public void actionPerformed(ActionEvent e) à l'extérieur de main.
    Pour faire propre oui(pas bien de coder quoi que ce soit dans un main....), mais dans le cas présent la solution se trouvera dans le fait de déclarer obj4 en final , mais bon ce n'est pas la panacée non plus
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  4. #4
    Membre actif
    Inscrit en
    Janvier 2003
    Messages
    604
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 604
    Points : 247
    Points
    247
    Par défaut
    Bon du coup j'ai mis mon code du Bouton à l'exterieur dans une nouvelle classe, mais je ne parviens pas à l'instancier. Je dois faire quelque chose de tres mal encore. Mais bon l'autoformation c'est pas le top...
    le message d'erreur :

    C:\Java\ObjetThread>javac unObjet.java
    unObjet.java:60: non-static variable this cannot be referenced from a static context obj5 =new threadBouton();
    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 threadBouton
    {
      monObjet obj4;
      threadBouton ()
      {
      JFrame uneFrame = new JFrame("test");
      JPanel unJpanel = new JPanel();
      uneFrame.setContentPane(unJpanel);
      JButton lebouton = new JButton("interruption");
      unJpanel.add(lebouton);
     
      uneFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
      uneFrame.pack();
      uneFrame.setVisible(true);
      lebouton.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e) 
      {
      obj4 = new monObjet("obj4");
      obj4.start();
      }});
      }
    }
    public static void main(String args[])
    {
      unObjet obj1;
      unObjet obj2;
      threadBouton obj5;
      [b]obj5 =new threadBouton();[/b]
      obj1 = new unObjet("obj1");
      obj2 = new unObjet("obj2");
      obj1.start();
      obj2.start();
    }
    }

  5. #5
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    un fichier java ne peut contenir qu'un seule classe: celle qui porte le même nom que le fichier, ensuite dans ta classe tu pourras créer des inner class, mais pas accéder à celles cis dans le main

    Fais voir l'intégralité de ton code, car il semble que tu ais besoin d'un peu de révisions en java
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  6. #6
    Membre actif
    Inscrit en
    Janvier 2003
    Messages
    604
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 604
    Points : 247
    Points
    247
    Par défaut
    Comme demandé l'intégralité du code.
    D'avance merci de vos réponses.


    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
     
     
    // modelisation d un objet avec des Threads
    public class unObjet extends Thread
    {
    private int var1, var2, var3;
    private String obj;
    public unObjet(String obj)
    {
    this.obj=obj;
    var1=0;
    System.out.println ("je suis un objet"+this.obj);
    }
     
    public void run()
    {
    try{
      for (int i=0;i<10;i++)
      {
      this.var1++;
      sleep(1000);
      System.out.println("objet="+this.var1+this.obj);
      }
    }
    catch (InterruptedException e) {}
     
    }
     
    public class threadBouton
    {
      monObjet obj4;
      threadBouton ()
      {
      JFrame uneFrame = new JFrame("test");
      JPanel unJpanel = new JPanel();
      uneFrame.setContentPane(unJpanel);
      JButton lebouton = new JButton("interruption");
      unJpanel.add(lebouton);
     
      uneFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
      uneFrame.pack();
      uneFrame.setVisible(true);
      lebouton.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e) 
      {
      obj4 = new monObjet("obj4");
      obj4.start();
      }});
      }
    }
    public static void main(String args[])
    {
      unObjet obj1;
      unObjet obj2;
      threadBouton obj5;
      obj5 =new threadBouton();
      obj1 = new unObjet("obj1");
      obj2 = new unObjet("obj2");
      obj1.start();
      obj2.start();
    }
    }
    et dans un autre fichier...


    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
     
    public class monObjet extends Thread
    {
    private int var1, var2, var3;
    private String obj;
    public monObjet(String obj)
    {
    this.obj=obj;
    var1=0;
    System.out.println ("je suis un objet"+this.obj);
    }
    public void run()
    {
    try{
      for (int i=0;i<10;i++)
      {
      this.var1++;
      sleep(5);
      System.out.println("objet="+this.var1+this.obj);
      }
    }
    catch (InterruptedException e) {}
     
    }
    }

  7. #7
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Citation Envoyé par sinok
    un fichier java ne peut contenir qu'un seule classe: celle qui porte le même nom que le fichier, ensuite dans ta classe tu pourras créer des inner class, mais pas accéder à celles cis dans le main

    Fais voir l'intégralité de ton code, car il semble que tu ais besoin d'un peu de révisions en java
    désolé sinok mais tu as aussi besoin de révision :p
    Il peut y avoir plusieurs classes dans un fichier .java. Mais une seule doit être publique et porter le même nom que le fichier.
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  8. #8
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Le problème vient du fait que tu veux instancier ta classe interne threadButton.

    Pour instancier une classe interne il faut avoir une instance de la classe englobante.
    Etant dans un contexte static (main est static), tu n'as pas d'instance de unObjet.

    il faudrait donc faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    obj5 = new unObjet().new threadButton();
    PS : par convention, les noms des classes commencent par une majuscule.
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  9. #9
    Membre actif
    Inscrit en
    Janvier 2003
    Messages
    604
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 604
    Points : 247
    Points
    247
    Par défaut
    Merci ca marche, quel talent.

  10. #10
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Désolé pour la faille, mais bon, mieux vaut éviter la surcharge de code dans un fichier (enfin c'est que je pense donc je morcelle au plus possible)
    Bon sur ce je vais retourner me planquer
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

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

Discussions similaires

  1. [Timer] Classes internes et actionEvent
    Par smag dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 04/07/2005, 06h51
  2. Heritage de classe avec classes internes
    Par Regis.C dans le forum Langage
    Réponses: 11
    Dernier message: 27/04/2005, 12h19
  3. [heritage] etendre une classe interne en dehors du package
    Par ChristopheH dans le forum Langage
    Réponses: 2
    Dernier message: 11/10/2004, 14h15
  4. [Débutant][Conception] Erreur avec une classe interne
    Par Devil Redneck dans le forum Général Java
    Réponses: 5
    Dernier message: 11/06/2004, 15h45
  5. [Thread] Erreur dans une classe interne
    Par totof2308 dans le forum Général Java
    Réponses: 5
    Dernier message: 03/06/2004, 08h15

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