Forum Programmation.java Problèmes de portée (enfin je crois)

Posté par .
Tags : aucun
0
13
nov.
2004
Bonjour les gens...
Je me suis mis tout à l'heure à Java, afin de coder un peu pour Looking Glass.
Et maintenant, je tombe sur un truc que je comprend pas.
En gros, j'ai utilisé un parseur de fichiers XML pour charger un fichier de conf. Maintenant j'aimerais en utiliser les résultats.
Voici le "vieux" code :
themes.addChild(
new BackgroundIcon("resources/images/icon/hoover.png",
width * 0.05f) {
protected Background initBackground() {
return new PanoImageBackground(
"resources/images/background/Stanford-", ".png", 2);
}
});


J'aimerais charger les éléments depuis mon fichier de conf. Pour ça, j'utilise un objet NamedNodeMap attributes de cette façon : attributes.getNamedItem("type").getNodeValue()
Le problème : à cause du protected, j'ai pas accès à mon objet attributes, déclaré plus haut par un simple NamedNodeMap attributes;
Comment résoudre ce problème ?
Merci d'avance
  • # pas tout compris

    Posté par (page perso) . Évalué à 2.

    Je comprends pas bien où se situe exactement ton problème, quelle est la relation entre le bout de code que tu as donné et ton objet NamedNodeMap ?

    De façon général quand on ne peut accéder à quelque chose de protected, on dérive de la classe qui le contient pour y accéder ou le rendre public. Je sais pas si celà répond à ta question :)
    • [^] # Re: pas tout compris

      Posté par . Évalué à 1.

      En gros, voici la structure du programme :
      try {
       NamedNodeMap attributes;
       pleind'autreschoses
       bout de code que j'ai donné en remplaçant les chaînes en brut par des attributes.getNamedItem("xxx").getNodeValue()
      } catch ..........
      • [^] # Re: pas tout compris

        Posté par (page perso) . Évalué à 2.

        c'est le protected devant ta déclaration de méthode qui te gène ?
        • [^] # Re: pas tout compris

          Posté par . Évalué à 1.

          Ben apparemment, c'est lui qui fais gueuler le compilateur : javac me dit qu'attributes doit être final, mais bon, final => constant => pas bon...
          Mais je peux pas l'enlever ou le changer en public : il gueule...
          • [^] # Re: pas tout compris

            Posté par (page perso) . Évalué à 2.

            Franchement file ton morceau de code entier parcque là c'est pas vraiment clair :)
            • [^] # Re: pas tout compris

              Posté par . Évalué à 1.

              Moi, pas clair ?
              Mais non :p
              Message d'erreur :
              local variable attributes is accessed from within inner class; needs to be declared final
              Le code est là : http://pinaraf.robertlan.eu.org/Taskbar.java(...)
              Merci d'avance...
              • [^] # Re: pas tout compris

                Posté par (page perso) . Évalué à 2.

                Je comprends mieux :)
                Déjà je mettrais pas la déclaration de attributes dans le try{}, faut mieux mettre le strict minimum dans le try{}.
                Ensuite effectivement il y a un problème à cause de ta classe interne qui ne peut pas accéder à une variable locale comme ça. Elle peut par contre accéder à un champ de ta classe : déclare ta variable attributes à l'extérieur de la méthode en tant que champ de la classe (sous appThumbnails par exemple).
                Le protected n'a strictement rien à voir avec la choucroute en fait : c'est pour limiter l'accès à la méthode protégée aux classes du packages et aux classes dérivées (bien que dériver d'une classe anonyme ça va être balaise).

                (PS : si tu veux mon avis, bien qu'étant un raccourci d'écriture, les classe internes anonymes gène franchement la lisibilité)
                • [^] # Re: pas tout compris

                  Posté par . Évalué à 1.

                  (PS : si tu veux mon avis, bien qu'étant un raccourci d'écriture, les classe internes anonymes gène franchement la lisibilité)
                  Tu trouves aussi ?
                  Le pb c'est que le code n'est pas de moi, sinon sois sûr qu'il y aurait pas ça !
                  J'essaye ce que tu m'as indiqué (merci !) et je te tiens au courant.
                  • [^] # Re: pas tout compris

                    Posté par . Évalué à 1.

                    Je viens d'envoyer le source modifié à l'adresse http://pinaraf.robertlan.eu.org/GTaskbar.java(...)
                    Malheureusement, à l'exécution, je me prends un :
                    java.lang.NullPointerException
                    at org.jdesktop.lg3d.scenemanager.utils.taskbar.GlassyTaskbar$1.initBackground(GlassyTaskbar.java:147)
                    at org.jdesktop.lg3d.scenemanager.utils.taskbar.GlassyTaskbar$BackgroundIcon.select(GlassyTaskbar.java:257)
                    at org.jdesktop.lg3d.scenemanager.utils.taskbar.GlassyTaskbar$BackgroundIcon$1.performAction(GlassyTaskbar.java:249)
                    at org.jdesktop.lg3d.utils.eventadapter.MouseClickedEventAdapter.processLgEvent(MouseClickedEventAdapter.java:434)
                    at org.jdesktop.lg3d.displayserver.event.EventProcessor.processEventList(EventProcessor.java:225)
                    at org.jdesktop.lg3d.displayserver.event.EventProcessor.run(EventProcessor.java:199)
          • [^] # Re: pas tout compris

            Posté par . Évalué à 1.

            final est presque équivalent à constant c'est vrai, mais uniquement pour la variable. En l'occurence la variable est une référence sur une instance, et c'est cette référence qui est constante, pas l'objet. Donc en mettant final elle ne pourra pointer que vers cet objet, mais l'objet lui peut toujours être modifié.
  • # Youpi !!! Ça marche !

    Posté par . Évalué à 2.

    Merci à vous de vous être penchés sur le problème :)
    Ça marche maintenant. Pour cela, j'ai créé une classe PanoramicBackground dont le constructeur prend en argument un NamedNodeMap... Ensuite, j'en stocke dans un vector et ça roule :)
    J'enverrai le code plus tard pour les intéréssés (dès que j'aurai fini la gestion des fonds d'écran Layered)

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.