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

Java Discussion :

block static non exécuté


Sujet :

Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 56
    Points : 54
    Points
    54
    Par défaut block static non exécuté
    Bonjour à tous,

    Je débute avec java et là je sèche un peu. Je souhaite faire un logiciel qui ressemblerait à paint. J'ai donc fait une interface Shape qui représente une forme comme une ligne, un carré... Ensuite, dès que je veux ajouter une nouvelle forme, j'implémente Shape dans Line par exemple. Line contient aussi une classe static LineFactory qui implémente ShapeFactory. Ceci sert à pouvoir cliquer sur l'icône "ligne" qui mettrait la factory courante du programme à "LineFactory". Ainsi, quand je dessinerais quelque chose à l'écran, la factory courante me fabriquera une ligne (et non un carré ou autre). La principale difficulté vient du fait que j'aimerais n'avoir qu'à implémenter Shape et ShapeFactory pour créer une nouvelle forme et que ce ne soit pas au main de rajouter toutes les formes possibles mais bien les formes qui se rajoutent elles-mêmes.
    Je fais donc pour Square par exemple :

    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
     
    public class Square extends FourCornerShape 
    {
        private Rectangle2D m_square;
     
        private Square(int x, int y, long level) 
        {
            super(x, y, level);
     
            m_square = new Rectangle2D.Float(x, y, cornerSize, cornerSize);
        }
     
        //quelques fonctions
     
        //about factory
        //ici, je fais la factory
        public static class SquareFactory extends ShapeFactory{
            //un peu de code encore
     
            //ici je propose de construire un carré
            public Shape createShape(int x, int y, long level) {
                return new Square(x, y, level);
            }
        }
        //ici je me fais une factory "de classe"
        private static final Square.SquareFactory square_factory = new Square.SquareFactory();
        //là je fais un bouton qui aura comme image une ligne et quand on cliquera dessus, il dira au programme d'utiliser la factory square_factory
        private static final ShapeFactoryButton button = new ShapeFactoryButton(square_factory, image_prefix + "EmptySquare.jpeg");
        //et là, j'aimerais bien qu'il s'ajoute tout seul !
        static{
            SharedDrawingUI.getInstance().addShapeButton(button);
        }
    }
    Or le code static n'est pas exécuté, apparemment car je ne me suis jamais servi de cette classe mais c'est bien ça le problème, je ne veux pas que le reste du code appelle cette classe car il n'est même pas censé la connaître. Et donc, comment faire pour qu'il s'execute ?

    J'ai essayé avec les classeLoader, je m'en suis fait un qui permet de "résolver" la classe mais il ne lève aucune exception ni n'exécute le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class Loader extends ClassLoader{
     
        public void load(String pathName)
        {
            try {
                loadClass(pathName, true);
            } catch (ClassNotFoundException ex) {
                    Logger.getLogger(Loader.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    et dans le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Loader loader = new Loader();
    loader.load("Square");
    Mais le code static du carré ne s'éxecute toujours pas.
    Une idée ?
    Merci beaucoup !

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Class.forName("le.package.complet.Square");
    Mais honnêtement, les initialisations statiques, ce n'est plus très à la mode.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 56
    Points : 54
    Points
    54
    Par défaut
    Très bien, merci beaucoup.
    Après, je ne connais pas trop les packages, je sais juste que c'est les erreurs en début de fichier sur netbeans...
    Quelle serait une autre méthode plus à la mode pour permettre à n'importe quel programmeur de "facilement" de recréer une nouvelle forme avec sa factory à partir d'un template par exemple ?

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Définir une sorte d'interface ShapeManager, avec entre autres une méthode Button makeShapeButton().

    Toute personne qui veut créer une nouvelle forme doit implémenter ça, et en passer une instance au gestionnaire de UI.

    quelque chose genre,

    SharedDrawingUI.getInstance().addShapeManager(new MyShapeManager());

    Citation Envoyé par autre mickael Voir le message
    Après, je ne connais pas trop les packages, je sais juste que c'est les erreurs en début de fichier sur netbeans...
    La première ligne d'un fichier commence par "package", pas vrai ?
    Eh bien, cela indique le package des classes qui sont définies dans ce fichier.

    Si un fichier commence par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    package org.thelvin.machin;
     
    public class Truc {
    Alors le nom qualifié de la classe est org.thelvin.machin.Truc
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    l'idée de partir sur les factory est bien, mais il manque la partie ou tu centralise tes factory. En général quand on prévois des système de plugins ou autre, on centralise dans une fichier properties l'ensemble des classe qui implémentent ce service, ca permet d'itérer dans le code dessus pour charger tous les service. c'est ce qui est fait pour les factory xml par exemple.


    Regarde du coté de jakarta commons dicovery pour t'aider.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 56
    Points : 54
    Points
    54
    Par défaut
    Merci pour tout, effectivement, je vois mieux.
    Je vais regarder jakarta commons discovery.

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    et si tu ne veux pas t'embêter avec une librairies additionnelle, il y a le ServiceLoader qui fait aussi ce genre de travail en standard depuis java 6

    http://javasearch.developpez.com/j2s...iceLoader.html

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

Discussions similaires

  1. Non exécution d'une méthode repaint()
    Par Flophx dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 05/05/2006, 18h04
  2. [MySQL] Requête non exécutée
    Par harlock59 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 03/05/2006, 15h42
  3. On error goto Err : goto non exécutée au 2ème appel
    Par charliejo dans le forum Access
    Réponses: 1
    Dernier message: 11/04/2006, 15h00
  4. static / non-static ???
    Par benkunz dans le forum Langage
    Réponses: 4
    Dernier message: 05/04/2006, 09h49
  5. INCLUDE non exécuté
    Par Sadneth dans le forum ASP
    Réponses: 3
    Dernier message: 07/09/2003, 00h44

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