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

AWT/Swing Java Discussion :

comment dessiner ?


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Par défaut comment dessiner ?
    bonjour tout le monde,

    je suis un peu débutant en java, et je me demandais quel composant utiliser pour dessiner dans une JFrame (le tout avec swing de préférence).
    Le but serait de faire des point, des cercles carré et polygone avec des couleurs différentes ... comprendre les bases quoi ...

    Merci d'avance.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    L'idéal pour dessiner (et ne faire que cela) est d'utiliser un java.awt.Canvas, mais pour avoir un minimum de support d'écoute, utiliser un javax.swing.JComponent ne peut pas faire de tort.

    Dans tous les cas, il suffit de redéfinir la méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void paint(Graphics g) {
      ...
      g.draw...(params...);
      g.draw...(params...);
      g.draw...(params...);
      g.draw...(params...);
      ...
    }

  3. #3
    Membre chevronné
    Avatar de Orian
    Inscrit en
    Août 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Août 2006
    Messages : 372

  4. #4
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Citation Envoyé par dingoth
    L'idéal pour dessiner (et ne faire que cela) est d'utiliser un java.awt.Canvas, mais pour avoir un minimum de support d'écoute, utiliser un javax.swing.JComponent ne peut pas faire de tort.

    Dans tous les cas, il suffit de redéfinir la méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void paint(Graphics g) {
      ...
      g.draw...(params...);
      g.draw...(params...);
      g.draw...(params...);
      g.draw...(params...);
      ...
    }
    Pour dessiner ae AWT oui, à partir du moment ou tu fais du swing tu peux oublier (cf heavyweight/lightweight). Dans Swing n'importe quel composant se prète au dessin, en effect ils héritent tous de JComponent et donc possède la méthode paintComponent.
    Ensuite pour faire du dessin pur autant utiliser un JComponent ou un JPanel, celà suffira amplement

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Par défaut
    suite à toutes vos remarque, je me pose des questions ...

    j'ai déclaré un JPanel dans lequel je souhaite faire mes dessins (jusque la, tout va bien).
    Puis je fais appel à la méthode paint de mon JPanel. cette méthode attend un Graphics comme objet.

    donc je déclare mon Graphics, mais je sais pas comment l'intencier !!!

    private Graphics g;
    ...

    Le constructeur de cette classe est "protected" du coup j'au une erreur quand je fais:
    g = new Graphics()

    ==>Cannot instantiate the type Graphics

    que dois je faire?

  6. #6
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 112
    Par défaut
    L'objet Graphics est un objet qu'on "se passe" d'un objet a l'autre (je sais pas si je suis clair).

    tu as dans ton code d'origine :

    public void paint(Graphics g) {

    tu dois reutiliser le meme g et pas en creer un nouveau.

  7. #7
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    En swing mieux vaut redéfinir paintComponent que paint, grosso merdo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class MonPanel extends JPanel {
    ...
     
    protected void paintComponent(Graphics g) {
    g.drawLine(..);
    g.fillRectangle(...);
    }
    }

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Par défaut
    merci pour cette précision,

    cependant la méthoe dque je vais redéfinir (paintComponent) elle attend comme paramètre un Graphics.

    et ma question est comment cré t'on un Graphics, car le constructeur est protected et quand je l'appel j'ai une erreur qui se crée!

  9. #9
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    en fait la méthode paintComponent n'as pas besoin d'être appelée manuellement dans ton code, Swing s'en chargeant déja sans que tu ais besoin d'intervenir. La seule chose à faire c'est de redéfinir cette méthode. En suite elle sera appelée automatiquement à chaque repaint de ton interface, ou quand tu appelle la méthode repaint de ton panel

  10. #10
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Par défaut
    merci pour ton aide sinok,

    maintenant, je cherche à pousser mon expérience un peu plus loin ...

    je souhaite créer un point, ligne , carré , rectangle, cercle grace aux action de la sourie.
    pour cela, ma classe implements MouseListener. Je dois donc redéfinir toutes les méthodes en relation avec cette interface ( mouseClicked, mousePressed, mouseReleased sont les actions qui m'intéresse). j'arrive à récupérer les coordonnée de la sourie, mais ce qu'il me manque c'est le moyen de dessiner une ligne ou autre sur mon panel une fois les coordonnées récupérées.

    si quelqu'un a des explication à me donner, je suis preneur.

    voila mon code du moment:

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    public class PaletteDessin extends JPanel{
     
    	//données membres
    	private JPanel vue;
     
    	public JPanel getVue()
    	{
    		return this.vue;
    	}
     
    	public PaletteDessin()
    	{
    		this.vue = new JPanel();
    	}
     
    	protected void paintComponent(Graphics g) {
    		g.drawLine(2, 3, 4, 5);
    		g.drawRect(10, 10, 100, 20);
    		g.setColor(Color.green);
    		g.fillOval(100, 100, 200, 200);
    	}
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Frame f = new Frame();
    		f.setTitle("Palette dessin");
    		f.setSize(150, 210);
    		f.addWindowListener(new WindowListener(){
     
    			public void windowActivated(WindowEvent arg0) {
    				// TODO Auto-generated method stub
     
    			}
     
    			public void windowClosed(WindowEvent arg0) {
    				// TODO Auto-generated method stub
     
    			}
     
    			public void windowClosing(WindowEvent arg0) {
    				// TODO Auto-generated method stub
    				System.exit(0);
    			}
     
    			public void windowDeactivated(WindowEvent arg0) {
    				// TODO Auto-generated method stub
     
    			}
     
    			public void windowDeiconified(WindowEvent arg0) {
    				// TODO Auto-generated method stub
     
    			}
     
    			public void windowIconified(WindowEvent arg0) {
    				// TODO Auto-generated method stub
     
    			}
     
    			public void windowOpened(WindowEvent arg0) {
    				// TODO Auto-generated method stub
     
    			}});
     
    		f.addMouseListener(new MouseListener(){
    			Point p1, p2;
    			public void mouseClicked(MouseEvent arg0) {
    				// TODO Auto-generated method stub
    				System.out.println(arg0.getPoint());
    				p1.setX(arg0.getPoint().x);
    				p1.setY(arg0.getPoint().y);
    				p2 = p1;
    			}
     
    			public void mouseEntered(MouseEvent arg0) {
    				// TODO Auto-generated method stub
     
    			}
     
    			public void mouseExited(MouseEvent arg0) {
    				// TODO Auto-generated method stub
     
    			}
     
    			public void mousePressed(MouseEvent arg0) {
    				// TODO Auto-generated method stub
    				System.out.println(arg0.getPoint());
    			}
     
    			public void mouseReleased(MouseEvent arg0) {
    				// TODO Auto-generated method stub
    				System.out.println(arg0.getPoint());
    			}});
     
    		PaletteDessin pal = new PaletteDessin();
     
    		f.add(pal);
    		f.setVisible(true);
    	}
    }

  11. #11
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    Ton objet doit disposer d'une liste de Point/Point2D OU d'une liste de Line/Line2D. Quand tu receptionnes le clic de la souris tu ajoutes le points a la liste (ou tu crees une nouvelle ligne celon la methode que tu preferres) et tu appelles repaint(). La redefinition de ton paintComponent() se contente alors de parcourir la liste en question et de dessiner les objets approprie sur le graphics : drawLine() si on a une liste de points ou draw() si on a une liste de lignes (note : cette seconde methode demande a ce que tu castes ton Graphics en Graphics2D).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    private java.util.List<Line> lineList = new LinkedList<Line>();
     
    /** @inheritDoc
     */
    @Override protected void paintComponent(Graphics g) {
      Graphics2D g2d = (Graphics2D)g;
      //g2d.setColor(...);
      g2d.setPaint(...);   
      g2d.setStroke(...);
      for (Line line : lineList) {
        g2d.draw(line);
      }
    }
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  12. #12
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Par défaut
    Bonjour à tous,

    Petite question : n'y a t'il pas que les vecter qui ont une allocation dynamique de mémoire ?

    Je pose cette question car si c'est le cas, comment connaître à l'avance le nombre d'objets qui va être dessiné ?

  13. #13
    Membre Expert Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 39
    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
    Par défaut
    Non la pluspartdes structure de java.uitl(je veux ps dire tous pour pas dire de bétise mais tous ce que je connais) ont une allocation dynamique de mémoire tu peut donc utiliser une ArrayList ou une Linked List ou un Set c'est ce qui me semble le plus adapté.

  14. #14
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Je confirme, c'est de l'allocation dynamique. Pas besoin de savoir à l'avance le nombre maximum d'object contenu dans ces collections.

  15. #15
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Par défaut
    Merci
    je me coucherai moins bête ce soir...

Discussions similaires

  1. Comment dessiner une ligne dans un Chart ?
    Par libititi dans le forum Composants VCL
    Réponses: 3
    Dernier message: 16/06/2005, 15h56
  2. Comment dessiner sur un Bitmap sans scintillement ?
    Par TOTO32 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 10/01/2005, 11h11
  3. DBGrid, comment dessiner dans les titres des colonnes
    Par dleu dans le forum Bases de données
    Réponses: 9
    Dernier message: 04/11/2004, 18h49
  4. [Transparent] - Comment dessiner sur 2 TImage ?
    Par TOTO32 dans le forum Langage
    Réponses: 15
    Dernier message: 08/08/2004, 02h06

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