Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Swing, dessin sur JPanel [ Multimédia / Java2D ] (mistere86)

mercredi 7 mai 2008 à 13:22:30 | Swing, dessin sur JPanel

mistere86

Salut tout le monde, voila j'ai un probleme sur un projet ou tout du moins je ne sais pas comment arriver a mes fins.

J'explique,
j'ai des classes modeles : AireLivraison, Activite, Rue, etc. Chaque modele possede des getters et des setters.
j'ai un PlanPanel qui étend JPanel. Ce PlanPanel permet de visualiser graphiquement la position des aires et des activités seulement.
j'ai un AireLivraisonDialog qui étend JDialog. Ce dialog permet de creer ou modifier une aire de livraison.

Alors en fait je voudrai que le dialog creer une AireLivraison et que le PlanPanel ecoute les modeles pour mettre a jour la zone de dessin. Aussi comme ca si je modifie le rayon d'action de l'aire (ce rayon permet de savoir si une activité utilise cette aire) le cercle autour de l'aire (sur la zone de dessin PlanPanel) grandit ou retrecit.

Je ne c'est pas trop comment mettre en place ce mecanisme, si vous avez des suggestions, allez-y !

J'ai pas trop le temps la donc jai expliqué vite fait mais ce soir s'il y en qui se sont intéressé je donnerai des précisions.

mercredi 7 mai 2008 à 14:02:07 | Re : Swing, dessin sur JPanel

indiana_jules

Bonjour,
Je te conseille de t'orienter au niveau des Design Pattern, notamment le fabuleux Observer/Observable.
Le principe: un objet (observable) va surveiller l'état plusieurs autres objets (observer). Quand l'un d'eux change son état, il émet un signal à l'obersable. Du coup, celui-ci est au courant du changement.

Du coup, ton panel devra implémenter observer, où tous tes petites classes graphiques (ayant un objet héritant d'observable) "s'inscriront", et quand une valeur se modifie, elles devront faire un "setChanged();' puis un "notifyObservers()" sur leur objet observable (notifyObservers accept les paramétres supplméentaires).

Du coup, ton panel principal sera au courant de toutes modifications (j'ai fait une application de configuration et de gestions d'observations qui utilisent beaucoup ce pattern).

Voilà, et bonne continuation

(un exemple : [ Lien ])

[#Tout le monde a des idées : la preuve, c'est qu'il y en a de mauvaises]
[#Je ne comprends pas tout, mais je parle de tout : c'est ce qui compte]

mercredi 7 mai 2008 à 18:02:39 | Re : Swing, dessin sur JPanel

mistere86

Oui je vais me servir du pattern Observer/Observable mais est ce que je dois créer des classes graphiques pour representer mes modeles (que 2 modeles sur 6 sont representé graphiquement) ou alors faire directement les figures avec les donnees de mes modeles.

En gros:
1er solution:
public class AireGraphique extends Rectangle2D.Double {
    private AireLivraison aire;                       // modele d'aire de livraison
    private Ellipse2D.Double cercle;      // pour visualiser le rayon de l'aire
    public AireGraphique(AireLivraison aire) {
        super(aire.getX(), aire.getY(), 10, 10);
        this.aire = aire;
        cercle = new Ellipse2D.Double(aire.getX(), aire.getY(), aire.getRayon() * 2, aire.getRayon() * 2);
    }
}

2eme solution: dans le JPanel
public void paintComponent(Graphics g) {
    Graphics2D g2d = (Graphics2D) g;
    for(AireLivraison aire : aires) {
       Ellipse2D.Double rayon2d = new Ellipse2D.Double(aire.getX(), aire.getY(), aire.getRayon() * 2, aire.getRayon() * 2);
       Rectanle2D.Double base2d = new Rectanle2D.Double(aire.getX(), aire.getY(), 10, 10);
    }
    // et les activites aussi mais la, c'est un seul carre.
}

Alors qu'est ce que vous en pensez, j'aime assez la seconde.

mercredi 7 mai 2008 à 18:14:13 | Re : Swing, dessin sur JPanel

indiana_jules

Salut,

Personnellement, je préfére la première solution, car elle se rapporche du Design Pattern light model (poids mouche). en effet, ce sont tes classes qui sont censés savoir comment elles se dessinent, et non pas ton panel (imagine que tu veuilles faire un seconde panel, tu devras tout refaire). De plus, d'un point d evue performance, c'est plus intéressant. Du coup, il conviendrait d'avoir dans ton panel une méthode du genre:

public void paintComponent(Graphics g) {

   //Je me dessine ...
}

Et la méthode paintComponent de ton JPanel pourrait l'appeler (de ce fait, tu te fiches de savoir comment elles se dessinent car tu délégues cette tâche)

Voili voilà

[#Tout le monde a des idées : la preuve, c'est qu'il y en a de mauvaises]
[#Je ne comprends pas tout, mais je parle de tout : c'est ce qui compte]


mercredi 7 mai 2008 à 21:55:46 | Re : Swing, dessin sur JPanel

mistere86

Hey, encore moi.

voila jai fait ca:
public class AireLivraisonForme implements Observer, Dessinable {
    private AireLivraison aire;
    private Rectangle2D.Double base;
    private Ellipse2D.Double rayon;
    private int tailleBase;
   
    public AireLivraisonForme(AireLivraison aire) {
        this.aire = aire;
        this.aire.addObserver(this);
        this.tailleBase = 10;
        base = new Rectangle2D.Double(aire.getPosition().getX() - tailleBase / 2,
                aire.getPosition().getY() - tailleBase / 2, tailleBase, tailleBase);
        int r = aire.getRayonAction();
        rayon = new Ellipse2D.Double(aire.getPosition().getX() - r,
                aire.getPosition().getY() - r, r * 2, r * 2);
    }

    public void update(Observable o, Object arg) {
        base.setFrame(aire.getPosition().getX(), aire.getPosition().getY(), 10, 10);
        int r = aire.getRayonAction();
        rayon.setFrame(aire.getPosition().getX() - r, aire.getPosition().getY() - r,
                r * 2, r * 2);
    }

    public void dessiner(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.BLUE);
        g2d.fill(base);
        g2d.setColor(Color.GRAY);
        g2d.draw(rayon);
    }

}

Dessinable est une interface qui fournit une methose dessiner(graphics g).
Comme ca dans mon JPanel:
List<Dessinable> formes
// ...
public void paintComponent(Graphics g) {
    for(Dessinable f : formes) {
       f.dessiner(g);
    }
}

ca marche mais par contre aurait tu une idee pour que je puisse faire du clicker/deplacer pour mes aires et aussi ce clic droit pour un petit menu (modifier, supprimer).
Faudrai que mes formes puisse implementer MouseListener mais comment ?

jeudi 8 mai 2008 à 09:04:57 | Re : Swing, dessin sur JPanel

indiana_jules

Salut,
En ce qui concerne le clic droit sur l'élément pour un petit menu, cela devrait pas être trop dur, il suffit de faire un JPopupMenu un peu comme cela :

public class MaClass extends JPanel ... {

    public MaClass() {
       ...

       this.addActionListener(new MouseAdapter() {
          new mouseClicked(MouseEvent e) {
                JPopupMenu popup=new JPopupMenu();
                popup.add(...); //Ajout des menus items
                popup.show(e.getComponent(),e.getX(),e.getY());
          }
    }
   
    ...
}

En revanche pour le déplacement, je dirai que cela se joue plutôt au niveau de ton JPanel principal. Ou alors tu peux essayer que tes classes graphiques utilisent le drag and drop, sahcnat que tes formes seraient en "drag" et ton panel principal en "drop".

Ce qui t'éviterait quelques parts de faire les calculs de déplacement. Un exemple: http://gfx.developpez.com/tutoriel/java/swing/drag/

Voili voilà

[#Tout le monde a des idées : la preuve, c'est qu'il y en a de mauvaises]
[#Je ne comprends pas tout, mais je parle de tout : c'est ce qui compte]



Cette discussion est classé dans : permet, jpanel, dessin, aire, planpanel


Répondre à ce message

Sujets en rapport avec ce message

Aide vrai débutant ! [ par assoul ] Bonjour, Voila je rencontre qqes difficultés pour un projet de la fac et j'aimerais avoir qqes explications sur certains points : Je n'arrive pas à Disparition de dessin dans un JPanel [ par koalish ] bien le Bonjour à tous !!!J'ai créé un JPanel avec comme arrière plan une carte de la Belgique et j'ai une méthode qui me permet de cliquer sur cette Problème de dessin dans JPanel [ par fantmar ] bonjours à tous j'ai réaliser un petit jeu qui consiste à tirer une balle par canon avec une vitesse initiale est une angle donnée. j'ai utiliser un J Detruire objet JPanel et ce qu'il contient [ par poiuytrez3 ] Bonjour, J'ai fait un petit logiciel qui permet d'additionner des temps pour la course à pied. Cependant il y a un JPanel (l'espèce de tableau qui per JScrollPane et JViewport [ par Rescue ] A la base j'ai un JPanel principal qui contient une grille de petits jpanels images (une platforme de 30 sur 20) et je voudrais le mettre dans un Jsc format de sortie en java [ par zeriab ] Bonjour, Dans le cadre d'un projet java ( dessin automatique de graphe) j'ai à définir des format de sortie du mon dessin final afin de l'intégrer dan Probleme de repaint [ par homer__rules ] Bonjour tout le monde ! J'ai un petit probleme de repaint Mon appli (JFrame) se decompose en 3 parties : le tout est geré par un BorderLayout J'ai Help please : repaint() [ par homer__rules ] Hello ! Quelqu'un pourrai-t-il m'aider sur un sujet que j'ai posté hier ? Je n'ai pas vraiment eu de reponse... Merci d'avance Bonjou comment rajouter des courbes de bezier sur un JPanel en tant que JComponent? [ par kid80 ] Salut a tous, je vous serais très reconnaissant de m'aider, je suis sur un projet a l'école et c'est bientot la fin...et je ne suis pas super avancé.. problème de création d'une image [ par jc_romeo ] BonjourJ'aimerai executer la fonction createImage dans un JPanel mais il me retourne null à chaque foisJ'ai donc pensé à remplacer le JPanel par un JF


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,468 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.