Swing, dessin sur JPanel

mistere86 Messages postés 10 Date d'inscription mardi 29 avril 2008 Statut Membre Dernière intervention 2 juin 2008 - 7 mai 2008 à 13:22
yabda Messages postés 4 Date d'inscription dimanche 31 janvier 2010 Statut Membre Dernière intervention 13 avril 2010 - 13 avril 2010 à 18:43
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.

6 réponses

indiana_jules Messages postés 750 Date d'inscription mardi 9 mars 2004 Statut Membre Dernière intervention 23 décembre 2008 22
7 mai 2008 à 14:02
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 : http://www.commentcamarche.net/forum/affich-992031-utiliser-le-patron-observable-en-java)

le monde a des idées : la preuve, c'est qu'il y en a de mauvaises
ne comprends pas tout, mais je parle de tout : c'est ce qui compte
0
mistere86 Messages postés 10 Date d'inscription mardi 29 avril 2008 Statut Membre Dernière intervention 2 juin 2008 17
7 mai 2008 à 18:02
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.
0
indiana_jules Messages postés 750 Date d'inscription mardi 9 mars 2004 Statut Membre Dernière intervention 23 décembre 2008 22
7 mai 2008 à 18:14
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à

le monde a des idées : la preuve, c'est qu'il y en a de mauvaises
ne comprends pas tout, mais je parle de tout : c'est ce qui compte
0
mistere86 Messages postés 10 Date d'inscription mardi 29 avril 2008 Statut Membre Dernière intervention 2 juin 2008 17
7 mai 2008 à 21:55
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 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
indiana_jules Messages postés 750 Date d'inscription mardi 9 mars 2004 Statut Membre Dernière intervention 23 décembre 2008 22
8 mai 2008 à 09:04
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à

le monde a des idées : la preuve, c'est qu'il y en a de mauvaises
ne comprends pas tout, mais je parle de tout : c'est ce qui compte
0
yabda Messages postés 4 Date d'inscription dimanche 31 janvier 2010 Statut Membre Dernière intervention 13 avril 2010
13 avril 2010 à 18:43
merci por l'explication c super
0
Rejoignez-nous