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

Collection et Stream Java Discussion :

[débutant] un tableau de dimension variable selon l'objet qui le contient


Sujet :

Collection et Stream Java

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 76
    Points : 80
    Points
    80
    Par défaut [débutant] un tableau de dimension variable selon l'objet qui le contient
    bonjour à tous,

    3 semaines maintenant de POO, et mon cerveau sclérosé par des années de progr structurée commence enfin à admettre que tout est objet et communication entre les objets (merci Doudoux et Eckel)

    restent donc les soucis de syntaxe et bien sûr de static/non static, classique chez un débutant j'imagine. aussi si vous êtes agacé par les questions de jeunôts, n'allez pas plus loin ..

    bon, ma question concerne un tableau de n JTextField défini et instancié à la création d'un objet ' pof ' de classe ' Plouf ' (par exemple), n étant l'argument passé à l'instanciation de pof (Plouf pof=new Plouf (n) )

    mon problème, c'est que pof est une fenêtre contenant n JTextField dont je veux récupérer les getText() lors du clic sur un bouton rajouté dans la fenêtre pof.

    le souci, c'est l'endroit où j'instancie le tableau de JTextField (JTextField aff[]=new JTextField [n] )

    si je le fais dans le constructeur de la classe Pouf, ce tableau n'existe plus en dehors et donc la méthode actionPerformed renvoie NullPointerException sur le aff[i].getText()

    si je le fais dans une méthode, pareil

    si je le fais dans les champs (j'aime bien cette phrase ..), avec un indice taille, il me renvoie un indice 0 (j'ai pensé faire de taille un pointeur sur une méthode qui reçoit taille=nb du constructeur, mais d'une part ça me paraît rocambolesque, d'autre part faudrait peut-être que je pense à arrêter de bricoler des mélanges de syntaxes de C et de néo-Java et que je fasse les choses de façon plus rigoureuse).

    j'ai cherché dans plusieurs bouquins et plusieurs FAQ et tutos, mais aucun ne me vient en aide précisement sur ce point, est-ce que quelqu'un pourrait me donner un conseil avisé et expérimenté de pur Java ?

  2. #2
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Je suis pas sûr d'avoir bien compris ta question, mais bon, je me lance.

    Il faut que tu déclares ton tableau en tant que variable d'instance et que tu l'initialises dans ton constructeur tout simplement.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Plouf{
       private JTextField[] fields = null;
     
       public Plouf(int n){
          fields = new JTextField[n];
       }
    }
    C'est cela que tu veux faire ?

    Tu peut tout à fait déclarer un tableau à quelque part et l'initialiser plus tard.

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 76
    Points : 80
    Points
    80
    Par défaut
    alors le souci c'est ce que c'est ce que j'ai initialement fait, et j'ai fait un:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for ('i à n-1') 
                    fields[i]=JTextField(5);
    toujours dans le constructeur, après l'initialisation du tableau.

    mais l'existence de mon tableau semble être strictement interne à mon constructeur, et la référence à fields ou à fields[i] ailleurs dans la classe (par exemple dans la méthode actionPerformed) renvoit une erreur de compilation.

    et si je déclare le tableau dans les champs en fin de classe, la compilation passe, mais l'arrivée sur la méthode actionPerformed renvoit un NullPointerException sur fields [i]

    bref, la seule solution que j'ai trouvée est de déclarer et d'initialiser le tableau fields dans les champs, mais impossible de le faire avec un nombre d'objets JTextField variable en fonction de l'instanciation de l'objet global, je le fais donc avec un grand nombre histoire d'avoir de la place, mais c'est un sacré gaspillage de mémoire donc de ressources donc de temps de traitement d'application ....

    il doit bien exister une classe quelque part qui puisse servir à ce que je cherche, mais je ne la trouve pas

  4. #4
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par Epistocles
    alors le souci c'est ce que c'est ce que j'ai initialement fait, et j'ai fait un:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for ('i à n-1') 
                    fields[i]=JTextField(5);
    toujours dans le constructeur, après l'initialisation du tableau.

    mais l'existence de mon tableau semble être strictement interne à mon constructeur, et la référence à fields ou à fields[i] ailleurs dans la classe (par exemple dans la méthode actionPerformed) renvoit une erreur de compilation.

    et si je déclare le tableau dans les champs en fin de classe, la compilation passe, mais l'arrivée sur la méthode actionPerformed renvoit un NullPointerException sur fields [i]

    bref, la seule solution que j'ai trouvée est de déclarer et d'initialiser le tableau fields dans les champs, mais impossible de le faire avec un nombre d'objets JTextField variable en fonction de l'instanciation de l'objet global, je le fais donc avec un grand nombre histoire d'avoir de la place, mais c'est un sacré gaspillage de mémoire donc de ressources donc de temps de traitement d'application ....

    il doit bien exister une classe quelque part qui puisse servir à ce que je cherche, mais je ne la trouve pas
    Ton problème est bizarre...

    Une possibilité : ta méthode actionPerformed est dans une class anonyme ? Si oui, il faudra déclarer ton tableau final pour que la méthode y ait accès. Sinon, donne nous plus de code, car je vois pas vraiment ou peut être le problème. Et il est sûr que c'est resolvable en Java.

  5. #5
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut
    Bonjour

    Peux tu nous mettre le code du constructeur ? A mon avis tu déclare une variable locale dedans (variable qui a le même nom que ta variable d'instance).

    N'as-tu pas un truc du genre :

    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
     
    public class Plouf{
      private JTextField[] fields = null;
      public Plouf(int n){
          // Nouvelle variable /!\
          JTextField[] fields = new JTextField[n];
          for ('i à n-1') 
                    fields[i]=JTextField(5);
     }
     
      public void une methode() {
        System.out.println(fields[0]); // NullpointerException !!!
      }
     
     
    }
    A remplacer par

    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
    public class Plouf{
      private JTextField[] fields = null;
      public Plouf(int n){
          // On ne déclare pas une variable, on utilise la variable d'instance.
          this.fields = new JTextField[n];
          for ('i à n-1') 
                    this.fields[i]=JTextField(5);
     }
     
      public void une methode() {
        System.out.println(this.fields[0]); // pas de NullpointerException !!!
      }
     
     
    }
    'this' est la référence de l'instance de Plouf en cours. Je te conseille de toujours mettre this même si celui ci est implicite. Ca donne un code plus facilement compréhensible.

    yann

  6. #6
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 76
    Points : 80
    Points
    80
    Par défaut
    effectivement, c'était mon code initial, avant que je ne corrige

    tu as parfaitement compris, synthétisé, et répondu à mon problème, je te remercie beaucoup

    j'y penserai à l'avenir, je vais décortiquer ça

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/02/2014, 15h51
  2. tableau de dimension variable
    Par kapaty dans le forum C
    Réponses: 6
    Dernier message: 05/03/2010, 00h00
  3. Réponses: 11
    Dernier message: 11/06/2008, 18h05
  4. tableau à dimension variable
    Par Phoenix_Blue dans le forum C++
    Réponses: 17
    Dernier message: 18/11/2006, 14h17
  5. Réponses: 7
    Dernier message: 19/01/2006, 18h57

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