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

2D Java Discussion :

Dessiner en java avec plusieurs classes


Sujet :

2D Java

  1. #1
    Membre régulier Avatar de keub51
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 116
    Points
    116
    Par défaut Dessiner en java avec plusieurs classes
    Bonjour,

    Dans le cadre de mes études je dois developper un Mini Atelier de Genie Logiciel.. enfin bref.
    Je dois dessiner un petit rectangle dans un JPanel symbolisant une entité.

    J'ai plusieurs classes :
    - entite.java
    où j'ai mon dessin dans la méthode paint :

    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
     
        public void paint(Graphics g) {
     
     
                    g.setColor(Color.BLACK);
                    g.drawRect(10,10,100,150);
                    g.drawLine(10,40,110,40);
                    g.setColor(Color.GRAY);
                    g.drawLine(25,9,111,9);
                    g.drawLine(111,10,111,145);
                    g.drawLine(25,8,111,8);
                    g.drawLine(112,10,112,145);
                    g.drawLine(25,7,111,7);
                    g.drawLine(113,10,113,145);
     
        }
    Et le JPanel dans lequel je voudrai afficher ce dessin se trouve dans Agl.java :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if (e.getSource()==Dessin)
    {
     
    // Faire le dessin 
     
    }
    Comment puis je faire le plus simplement possible pour dessiner mon entité ?

    J'ai fait quelques tutoriel mais je ne trouve pas ce que je veux.


    Merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    J'avoue ne pas comprendre ton problème. Et c'est peut etre la meme chose pour les gens ayant lu de meme ton post.
    Essaye de preciser ton problème.
    Problème de modélisation? De maitrise du langage Java? De l'API Java?

  3. #3
    Membre régulier Avatar de keub51
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 116
    Points
    116
    Par défaut
    et bien jessaye juste de dessiner mon tit rectangle dans mon container qui se trouve dans agl.java et je ne vois aps comment faire ..

  4. #4
    Membre chevronné Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Points : 2 232
    Points
    2 232
    Par défaut
    Je sais pas si tu t'y prend correctement. Pour pouvoir dessiner dans un JPanel il faut que tu redéfinisse la méthode paint comme tu l'a fait. Mais tu ne peut la redéfinir qu'a l'endroit ou tu as ton JPanel (donc dans la même classe qui étend JPanel).

    En espérant t'aider

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    Moi je surchagerait la methode paint de ton JPanel en question.
    Apres si ton problème est de ne pas le faire en 'dur', il suffit que ton JPanel customisé est acces à une collection d'objets contenant les objets (les entites dans ton cas) qu'il doit dessiner.

    En fait, c'est exactement ce que fais l'interface graphique lors d'un ajout d'un composant à un composant parent. Une alternative plus compliquée serait donc de creer des entites JComponent par heritage. Puis après de se servir de l'API deja présente.

    Precision : La methode paint du parent appelle la methode paint des composants contenus avec le meme graphique.

  6. #6
    Membre régulier Avatar de keub51
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 116
    Points
    116
    Par défaut
    Ok donc si je passe le JPanel en parametre a la methode paint dans entite.java c'est une solution non ?

  7. #7
    Membre chevronné Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Points : 2 232
    Points
    2 232
    Par défaut
    Non la méthode paint doit être refénie dans la classe qui etend JPanel (Agl.java si j'ai bien suivi) et c'est le code de cette méthode qui sera executé lors du rafraichissement du panel.

  8. #8
    Membre régulier Avatar de keub51
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 116
    Points
    116
    Par défaut
    oki oki,

    bon je viens de coder un truc qui marche a peu pres :
    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
     
            //Si on clique sur MCD
            if(e.getSource() == MCD){
            FS.setVisible(false);
     
            FS=new JPanel(new BorderLayout()); 
     
            FS.setLayout(null);// On applique le layout
            FS.setBackground(Color.white);//couleur de fond
            FS.setBorder(new EtchedBorder(50,Color.black,Color.white));
            FS.setBounds(280,20,largeur-290,hauteur-80);
     
     
            container.add(FS);
     
            texte = new JLabel() ;//On crée notre objet
            texte.setPreferredSize(new Dimension(250,25)) ;//On lui donne une taille
            texte.setBounds(350,10,800,25);//position relative à i
            texte.setText(" Modele Conceptuel De Données"); //On lui donne un texte qui contient les résultats
            FS.add(texte);
     
     
     
     
            Entite Ent = new Entite("titre","clé",FS);
            g = FS.getGraphics() ; // on recupere le contexte graphique du panel
            Ent.paint(g);
     
     
            }

    FS étant mon JPanel ou je veux afficher mon dessin
    Ent l'instance de entite.java qui contiant mon dessin :

    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
     
        public void paint(Graphics g) {
     
     
                    g.setColor(Color.BLACK);
                    g.drawRect(10,10,100,150);
                    g.drawLine(10,40,110,40);
                    g.setColor(Color.GRAY);
                    g.drawLine(25,9,111,9);
                    g.drawLine(111,10,111,145);
                    g.drawLine(25,8,111,8);
                    g.drawLine(112,10,112,145);
                    g.drawLine(25,7,111,7);
                    g.drawLine(113,10,113,145);
     
     
        }

    g un objet de type graphics

    voici le constructeur de entite.java :
    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
     
    public class Entite extends JPanel {
        // données
          // données interne
        String Titre;
        String PrimaryKey;
        String[] Attribut;
        int MAX_ATT=100;
            //données graphiques
        int hauteur;
        int largeur;
        Graphics g;
        JPanel p;
     
        /** Creates a new instance of Entite */
        public Entite(String t,String p,JPanel pa) {
     
            this.p=pa;
            this.g=g;
            Titre=t;
            PrimaryKey=p;
            Attribut=new String[MAX_ATT];
            hauteur=50;
            largeur=t.length()*4;
     
     
        }


    Mon probleme :

    Lorsque je clique sur MCD il affiche bien mon dessin mais pendant un court instant puis s'efface tout de suite ... pourquoi ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    On repete : il faut surcharger la methode paint de ton JPanel.

    Car la tu dessine une seule fois, mais des que la surface est repainte tu ne redessine pas, et donc cela "s'efface".

    Pour des exemples :
    http://java.sun.com/products/java-me...ite/index.html

    Voici le code correspondant a mon post precedant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Collection entites = ... // ce que tu veux
    JPanel tonJPanel = new JPanel() {
        void paint(Graphics g) {
           // itere sur la collection
                // dessine l'element de la collection 
        }
    });
    Edit :L'indentation aide à lire. Et tu a le droit (le devoir meme) d'utiliser des modificateurs de portées :
    http://java.developpez.com/faq/java/...motsClesPublic

  10. #10
    Membre régulier Avatar de keub51
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 116
    Points
    116
    Par défaut
    oui oki, mais il n'y a pas une autre technique si je ne veux pas que les lignes de code pour faire le dessin ne sont pas dans la classe qui contient mon JPanel ?

  11. #11
    Membre chevronné Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Points : 2 232
    Points
    2 232
    Par défaut
    Non il n'y a pas d'autre méthode mais à l'interieur de ta méthode paint tu peut faire appel à des méthode d'autre objet

  12. #12
    Membre régulier Avatar de keub51
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 116
    Points
    116
    Par défaut
    bon voila :

    j'ai crée une CollectionEntite de la maniere suivante :
    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
     
    public class CollectionEntite {
     
       String[] tab=new String[100];
       LinkedList l;
     
        /** Creates a new instance of CollectinEntite */
        public CollectionEntite() throws SQLException {
          bdd BD=new bdd();
          tab = BD.ListEntite();
     
     
          for(int i=0;i<tab.length;i++)
          {
              String nom_entite =tab[i];
              String nom_cle_primaire = BD.selectEntPKey(tab[i]);
              Entite E = new Entite(nom_entite,nom_cle_primaire);
              E.AddArrayAttribute(BD.Attribute(nom_entite));          
     
              l.addLast(E);
            }
          BD.fin_connexion();    
        } 
    }
    dans mon Agl ( la ou je veux afficher mon tit dessin ) j'ai instancé cette classe de la maniere suivante :
    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
     
            if(e.getSource() == AffEnt){
     
     
               try {
     
                    CollectionEntite C= new CollectionEntite();
                    Iterator I= C.l.iterator();
                    while(I.hasNext())
                    {
                      System.out.println("entite");
                    }
     
     
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
     
     
     
            }
    il crée donc une liste d'entite dont voici le constructeur :

    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
    public class Entite extends JPanel {
        // données
          // données interne
        String Titre;
        String PrimaryKey;
        String[] Attribut;
        int MAX_ATT=100;
            //données graphiques
        int hauteur;
        int largeur;
     
     
        /** Creates a new instance of Entite */
        public Entite(String t,String p) {
     
     
            Titre=t;
            PrimaryKey=p;
            Attribut=new String[MAX_ATT];
            hauteur=50;
            largeur=t.length()*4;
     
     
        }
    donc jaimerais dessiner de la maniere suivante toute les entitées contenue dans la collection d'entitées

    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
        public void paint(Graphics g) {
     
     
                    g.setColor(Color.BLACK);
                    g.drawRect(10,10,100,150);
                    g.drawLine(10,40,110,40);
                    g.setColor(Color.GRAY);
                    g.drawLine(25,9,111,9);
                    g.drawLine(111,10,111,145);
                    g.drawLine(25,8,111,8);
                    g.drawLine(112,10,112,145);
                    g.drawLine(25,7,111,7);
                    g.drawLine(113,10,113,145);
     
     
        }

    Comment puis je faire ( merci d'avoir de la patience lol )

  13. #13
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 852
    Points : 22 869
    Points
    22 869
    Billets dans le blog
    51
    Par défaut
    Citation Envoyé par TabrisLeFol
    On repete : il faut surcharger la methode paint de ton JPanel.
    Pour etre precis il est plus que conseille de surcharger protected void paintComponent(Graphics g) plutot que public void paint(Graphics g).



    Eh bien il te faut dans ton panel une reference sur ta collection de forme et l'appeller depuis la redefinition de paintComponent(). Ou est le probleme ?

    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
    import java.awt.*;
    import java.awt.image.*;
    import javax.swing.*;
     
    public class Entite extends JPanel {
     
        [...]
     
       /** {@inheritDoc}
       */
      @Override protected void paintComponent(Graphics g) {
        Insets insets = getInsets();
        Dimension size = getSize();
        Graphics2D g2d = (Graphics2D)g.create(insets.left, insets.top, size.width-(insets.left+insets.right), size.height-(insets.top+insets.bottom));
        try {
           ......
        }
        finally {
          g2d.dispose();
        }
      }
    }

Discussions similaires

  1. [JViews] dessiner un polyLine avec plusieurs stroke
    Par traiangueul dans le forum API standards et tierces
    Réponses: 0
    Dernier message: 26/04/2010, 17h03
  2. Réponses: 4
    Dernier message: 12/07/2009, 22h18
  3. [Artichow] Dessiner une courbe avec plusieurs couleurs
    Par m_jaz3 dans le forum Bibliothèques et frameworks
    Réponses: 13
    Dernier message: 03/11/2008, 16h26
  4. Programme Java avec la classe Terminal
    Par ginos dans le forum Langage
    Réponses: 6
    Dernier message: 05/05/2008, 16h07
  5. [VS2005] comment organiser une solution avec plusieurs classes
    Par mahboub dans le forum Visual Studio
    Réponses: 1
    Dernier message: 15/04/2008, 10h49

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