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 sur une BufferedImage


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 139
    Par défaut Dessiner sur une BufferedImage
    Bonjour,
    ds la methode paintComponent(Graphics g) de mon JComponent j'ai cree une BufferedImage et dessine une grille la dessus.

    Maintenant je veux quand bougant la souris j'ai une ligne vertical qui se dessine.

    J'ai lus pleins de tutoriaux, ds lesquels on dit qu'on peut tres bien dessiner sur une BufferedImage, a condition de recuperer son context graphique avec getGraphics().

    Moi ds mon cas, ca marche pas et je comprend pas tres bien pourquoi. Quelqu'un peut-il m'aider?

    la c'est le code de paintComponent(Graphics g)

    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
     
    ...
     
    public void paintComponent(Graphics g)
    {
    		Graphics2D g2 = (Graphics2D)g;
     
    		int w = 1500;
    		int h = 1500;
     
    		final int grid_step = 20;
     
    		MyPanel.GRIDIMG = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY);
     
    		Graphics2D g1 = MyPanel.GRIDIMG.createGraphics();
     
    		float[] dashPattern = { 3, 2 };
    		g1.setStroke(new java.awt.BasicStroke(1, java.awt.BasicStroke.CAP_BUTT, java.awt.BasicStroke.JOIN_MITER, 11, dashPattern, 0));		
     
    		g1.setColor(Color.WHITE);
    		g1.fillRect(0, 0, w, h); // fill in background
    		g1.setColor(Color.LIGHT_GRAY);		
     
    		//draw horizontal lines
    		for(int y=h; y>0; y-=grid_step) { g1.drawLine(0, y, w, y); }
     
    		//draw vertical lines
    		for(int x=w; x>0; x-=grid_step)	{ g1.drawLine(x, 0, x, h); }
     
    		g2.drawImage(MyPanel.GRIDIMG, null, 0, 0);
     
    		g1.dispose();
    		g2.dispose();
    	}	 
    ...

    et la celui de public void mouseMoved(MouseEvent e)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
     
    public void mouseMoved(MouseEvent e)
    {
    	Graphics2D g2 = (Graphics2D) MyPanel.GRIDIMG.getGraphics();
    	g2.setColor(Color.GREEN);
    	g2.drawLine(e.getX(), 0, e.getX(), this.getHeight());
    }
    ...
    Au fait je precise que la grille se dessine parfaitement mais PAS la ligne verticale.

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Tu modifies bien ton image... mais 1) tu oublies de demander le reaffichage du panel. Appelle repaint() a la fin de ton mouseMoved() (pense egalement a faire g2.dispose() la aussi). Et 2) de toute maniere tu en cree une nouvelle la prochaine fois que paintComponent() sera appele... exit donc la ligne. Il manque un test : tu ne dois creer la nouvelle image que si celle-ci est null.

    Egalement puisque tu utilises une image, as-tu vraiment besoin de redessiner la grille a chaque reaffichage ? Redessiner la grille a chaque fois n'est vraiment utile que quand tu dessines directement sur la surface du panel.

    Attention si tu utilises certains indices de rendu (nottament l'anti-aliasing) ou des peintures et couleurs semi-transparentes le fait de redessiner la meme ligne plusieurs fois sur elle-meme, sans reinitialiser la surface de l'image, change l'image au fil du temps...
    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

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 139
    Par défaut
    en ce qui concerne le reafichage...alors la je m'embrouille...parcque si je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.getGraphics();
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MyPanel.GRIDIMG.getGraphics();
    J'ai pas besoin d'appeller repaint pour visualiser la ligne...pourquoi?

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Evite de manipuler directement le graphics interne du composant de cette maniere. Tu peux eviter d'avoir une image cependant en dessinant directement sur le graphics aui est passe en paramettre de la method paintComponent() (et non pas celui retourne par la methode getGraphics() du composant - cette methode est a eviter !!).

    Dans ce cas comment dessiner la ligne ? Simple : en creant un membre de type Line ou en concervant le Point de l'endroit du clic et en dessinant la ligne appropriee dans paintComponent() par exemple. Si tu veux conserver une trace de toutes les lignes crees, manipuler une image peut etre une bonne idee cependant.
    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

Discussions similaires

  1. Dessiner sur une image
    Par cquadjul dans le forum C++Builder
    Réponses: 2
    Dernier message: 19/04/2006, 10h44
  2. Dessiner sur une image
    Par alex6891 dans le forum Java ME
    Réponses: 1
    Dernier message: 16/04/2006, 02h45
  3. [Debutant] Un thread qui dessine sur une fenetre ???
    Par Spartan03 dans le forum OpenGL
    Réponses: 6
    Dernier message: 05/04/2006, 20h19
  4. Déplacer, zoomer, dessiner (sur) une image
    Par charlito dans le forum 2D
    Réponses: 4
    Dernier message: 22/02/2006, 01h58
  5. [Servlet] [Image] Dessiner sur une image
    Par gaia_dev dans le forum 2D
    Réponses: 5
    Dernier message: 01/09/2004, 17h11

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