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 :

Problème de dessin de figure dans JPanel


Sujet :

Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 18
    Par défaut Problème de dessin de figure dans JPanel
    Bonsoir,
    j'ai un problème pour dessiner des figures dans un jpanel
    Le dessin est visible uniquement quand je relâche le bouton de la souris, or
    je voudrais qu'il m'affiche la figure (le rectangle) quand je suis dans le "mouseDragged"
    Voici la classe pour dessiner des rectangles:

    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
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.awt.image.BufferedImage;
    import java.util.EnumSet;
    import java.awt.geom.*;
     
     
    public class PaintRect extends ListeFormes implements MouseListener, MouseMotionListener {
     
    	private Graphics c;
    	private ListeFormes lf;
     
    	private boolean dragging;
    	public Color currentColor = Color.BLACK;
    	private Color remplico = Color.WHITE;
    	private int startX, startY;
    	int prevX, prevY;  
    	private int currentX, currentY;
    	int cpt=0;
    	public PaintRect(Graphics g,boolean drag) {
    		System.out.println("Boolean drag : "+drag);
    		this.dragging = drag;
    		c = g;
    	}
     
    	public void init(){
     
     
    	}
    	public void changeCouleurBord(Color cb){
    		this.currentColor = cb;
    	}
    	public void changeCouleurRempli(Color cr){
    		this.remplico = cr;
    	}	
     
    	public void putCurrentShape(Graphics g) {
    		putRect(g,startX, startY, currentX, currentY);
    	}
     
     
     
    	private void putRect(Graphics g, int x1, int y1, int x2, int y2) {
     
    		if (x1 == x2 || y1 == y2)
    			return;
    		if (x2 < x1) {  // Swap x1,x2 if necessary to make x2 > x1.
    			int temp = x1;
    			x1 = x2;
    			x2 = temp;
    		}
    		if (y2 < y1) {  // Swap y1,y2 if necessary to make y2 > y1.
    			int temp = y1;
    			y1 = y2;
    			y2 = temp;
    		}
    			g.setColor(remplico);
    			g.fillRect(x1,y1,x2-x1,y2-y1);
    			g.setColor(currentColor);
    			g.drawRect(x1,y1,x2-x1,y2-y1);
     
        }
     
    	private void repaintRect(int x1, int y1, int x2, int y2) {
    		if (x1 == x2 || y1 == y2)
    			return;
     
    		if (x2 < x1) {  // Swap x1,x2 if necessary to make x2 >= x1.
    			int temp = x1;
    			x1 = x2;
    			x2 = temp;
    		}
    		if (y2 < y1) {  // Swap y1,y2 if necessary to make y2 >= y1.
    			int temp = y1;
    			y1 = y2;
    			y2 = temp;
    		}
    		x1--;
    		x2++;
    		y1--;
    		y2++;
    		repaint(x1,y1,x2-x1,y2-y1);
     
        }
     
     
    	public void mousePressed(MouseEvent evt) {
     
    		startX = prevX = currentX = evt.getX();
    		startY = prevY = currentY = evt.getY();
    		this.dragging = true;
    	}
     
    	public void mouseDragged(MouseEvent evt) {
     
    		currentX = evt.getX();
    		currentY = evt.getY();
     
    		repaintRect(startX,startY,prevX,prevY);
    		repaintRect(startX,startY,currentX,currentY);
     
    		prevX = currentX;
    		prevY = currentY;
     
    	}
     
    	public void mouseReleased(MouseEvent evt) {
    			this.dragging = false;
    			Graphics g = this.c;
    			g.setColor(currentColor);
    			putCurrentShape(g);
    			g.dispose();
    			repaint();
    	}
     
    	public void mouseMoved(MouseEvent evt) { }
    	public void mouseClicked(MouseEvent evt) { }
    	public void mouseEntered(MouseEvent evt) { }
    	public void mouseExited(MouseEvent evt) { }
     
    }
    Et voici la classe dans laquelle j'appelle mon PaintRect pour dessiner des rectangles :
    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
    public PaintRect pr;
    Graphics g = getGraphics();
    			pr = new PaintRect(g,this.dragging);
    			pr.init();
    			this.addMouseMotionListener(pr);
    			this.addMouseListener(pr);
     
    public void paintComponent(Graphics g) {
     
    		if (OSC == null)
    			createOSC();
    		g.drawImage(OSC,0,0,null);
    		if (this.dragging) {
    			g.setColor(currentColor);
    			this.pr.putCurrentShape(g);
     
    		}
    	}
    Merci de votre aide

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 18
    Par défaut
    Apparemment il faut modifier la méthode paintComponent pour faire
    afficher les figures au mouseDragged car c'est cette méthode qui mets à jour le JPanel mais j'ai beau essayer, je n'arrive pas à trouver comment faire...

    Merci de bien vouloir m'aider

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Le point d'entrée pour tout ce qui est dessin au niveau d'un composant est bien la méthode paintComponent.

    Afin de dessiner sur un composant il faut utiliser les Graphics fournis en paramètre de cette méthode. Attention, ces Graphics correspondent à un contexte graphique n'existant que lors de l'appel de cette méthode. Les stocker pour les utiliser plus tard n'a aucun sens.


    De même, la méthode getGraphics ne fournit pas un objet viable pour dessiner sur un composant Swing.

Discussions similaires

  1. Problème de changement de Layout dans JPanel
    Par dodup64 dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 03/09/2010, 14h01
  2. Réponses: 0
    Dernier message: 28/08/2009, 18h00
  3. Problèmes de dessin de ligne dans une JFrame .
    Par Pragmateek dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 24/03/2008, 16h11
  4. Problème d'affichage de figure dans mon titre
    Par Math66 dans le forum Mise en forme
    Réponses: 9
    Dernier message: 07/06/2007, 14h07
  5. Réponses: 1
    Dernier message: 22/10/2006, 16h15

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