Résolu [JAVA] Container et Component

Solutions (6)
Tags :
  • Programme
  • Programmation
|
Bonjour à tous,

Voilà j'explique mon problème :
Je voudrais rédiger une méthode qui liste tout les component de tout les container de ma Frame.

En gros je voudrais pouvoir récupérer un component de ma Frame à partir de son nom.
J'indique comment est organiser ma Frame :
- Frame
------ RootPane
------------ Panel
------ LayeredPane
-------------- Panel
------------------- TabbedPane
-------------------------- Container
----------------------------------- MonComponent


Le truc c'est que comme une frame,RootPane,panel, etc ...... sont également des Container sauf le component je voudrais que ma méthode s'applique également pour n'importe quoi que soit dans ma Frame.

J'ai déjà un bout de code et j'obtiens des erreurs de Pointeurs Nuls dont il y'a quelque chose qui cloche.

Vous allez sûrement me dire que c'est mal rédigé, qu'il ne faut pas mettre une return dans une boucle , bref je tien à dire que cette méthode n'est qu'un test et que je la mettrai à jour quand mon problème sera résolu.
Pour explication, n'hésitez pas.

  1. public Component getComponentByName(String Name,Container contain)
  2. {
  3. for(int i = 0; i < contain.getComponentCount(); i++)
  4. {
  5. if(contain.getComponent(i).getName() == Name)
  6. return contain.getComponent(i);
  7. else if(contain.getComponent(i) instanceof Container)
  8. return getComponentByName(Name,(Container) contain.getComponent(i));
  9. }
  10.  
  11. return null;
  12. }


Cette méthode pourrait être le point central de mon programme et j'y suis passer de nombreuses minutes dessus.

Voilà merci d'avance.
Contenus similaires
Meilleure solution
partage
, Modérateur |
Ah oui, il y a un soucis dans le code en fait.
Le fait de faire return getComponentByName(name, (Container)component); fait que tu peux retourner null dès ton 1er composant.

Si on reprend ton arborescence:
  • il passe par Frame, ce n'est pas bon, donc il essaie de récupérer les composants dans les controls fils
  • il arrive à RootPane qui n'est pas bon, donc il check ses fils
  • il arrive à Panel qui n'est pas bon et qui n'a pas de fils, donc retourne null
  • et ce null remonte jusqu'à Frame, et donc ça retourne null

    Normalement, en remplaçant les lignes:
    1. else if (component instanceof Container)
    2. return getComponentByName(name, (Container)component);

    par
    1. else if (component instanceof Container)
    2. {
    3. Component component = getComponentByName(name, (Container)component);
    4. if (component != null)
    5. return component;
    6. }


    Ca devrait le faire...
    • Commenter cette solution |
    Score
    0
    òh
    òi
    |
    Meilleure réponse sélectionnée par galect21.
    • Commenter cette réponse |
    Score
    0
    òh
    òi
    |
    ok c'est vrai : la méthode fonctionne maintenant.

    Erreur stupide de ma part !

    Merci de ton aide, vraiment !

    Problème Résolu !
    • Commenter cette réponse |
    Score
    0
    òh
    òi
    |
    A ba tout compte fait .... ba non !!

    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

    Toujours la même erreur ... bref sinon jpe trouver une alternative mais bon j'aurais préférer avec cette méthode
    • Commenter cette réponse |
    Score
    0
    òh
    òi
    |
    Scuse a propos du return dans la boucle, c'est que mon ancien prof détestait cela mais je ne sais pas, j'aimais bien lui désobeir :p 

    Pour le script , je vais tester si cela change quelque chose ......

    Merci quand même de l'apport de ton aide.
    • Commenter cette réponse |
    Score
    0
    òh
    òi
    , Modérateur |
    Salut,

    Je ne vois pas de problème à mettre de return dans une boucle, je le fais très fréquemment. Une des règles de Refactoring qui existe est de retourner la valeur dès que tu l'as. Quoi de mieux qu'un return pour faire ça ;) 


    Et sinon, vis à vis de ton problème, ça fait un moment que je n'ai pas fait de Java, mais vu l'erreur, faudrait vérifier que l'objet ne soit pas null, j'aurais fait quelque chose dans ce genre :
    1. public Component getComponentByName(string name, Container container)
    2. {
    3. for (int i = 0; i < container.getComponentCount(); i++)
    4. {
    5. Component component = container.getComponent(i);
    6. if (component == null)
    7. continue;
    8. if (component.getName() == name)
    9. return component;
    10. else if (component instanceof Container)
    11. return getComponentByName(name, (Container)component);
    12. }
    13.  
    14. return null;
    15. }


    J'ai juste ajouté un check sur la nullité de l'objet, et puis créé un objet component pour éviter de faire plusieurs fois des appels à getComponent(i).
    • Commenter cette réponse |

    Ce n'est pas ce que vous cherchiez ?

    Tom's guide dans le monde
    • Allemagne
    • Italie
    • Irlande
    • Royaume Uni
    • Etats Unis
    Suivre Tom's Guide
    Inscrivez-vous à la Newsletter
    • ajouter à twitter
    • ajouter à facebook
    • ajouter un flux RSS