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


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut Problème de dessin
    Bonjour,

    Alors voila, dans le cadre d'un projet de mon université, mes deux collègues et moi devont réaliser un logiciel de traitement d'image, en JAVA. Nous avons choisi d'y ajouter un petit module de dessin.
    Le soucis rencontré est que le tracé des différentes formes n'est pas centré par rapport au pointeur, en gros, le tracé est situé à environ 1 cm au dessus du clic.
    Vu que nous pensons que cela est dû au menu et aux bordures de la fenêtre, nous avons essayé de régler cet écart manuellement, en ajoutant quelques pixels en hauteur. Cela fonctionne tant que l'on ne redimensionne pas la fenêtre, mais ce n'est pas très propre...

    Voici ma 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
    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
    public void paint(Graphics g1)
    	{
    		Graphics2D g = (Graphics2D)bimage.createGraphics();
    		Stroke s;
    		Color c;
    		g.drawImage(bimage, 0, 0, this);
     
    		for (Object obj : this.o)
    		{
    			if (obj instanceof Rectangle)
    			{
    				Rectangle r = (Rectangle) obj;
    				c = g.getColor();
    				g.setColor(r.getColor());
    				s = g.getStroke();
    				if (r.fill == 0)
    				{
    					g.setStroke(new BasicStroke(r.getSize()));
    					g.drawRect(r.getX(), r.getY(), r.getWidth(), r.getHeight());
    					g.setStroke(s);
    				}
    				else
    				{
    					g.fillRect(r.getX(), r.getY(), r.getWidth(), r.getHeight());
    				}
    				g.setColor(c);
    			}
    			else if(obj instanceof Line)
    			{
    				Line l = (Line) obj;
    				c = g.getColor();
    				g.setColor(l.getColor());
    				s = g.getStroke();
    				g.setStroke(new BasicStroke(l.getSize()));
    				g.drawLine(l.getX(), l.getY(), l.getX1(), l.getY1());
    				g.setStroke(s);
    				g.setColor(c);
    			}
    			...
    		}
    		this.jl.setIcon(new ImageIcon(bimage));
    		g.dispose();
    }
    Constructeur de Rectangle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public Rectangle(int x, int y, int width, int height, int size, Color color, int fill)
    Et voici comment je récupère les valeurs pour les dessins :

    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
    	public void clicked(MouseEvent e) //On récupère les coordonnées de départ (au clic)
    	{
    		this.debX = e.getX();
    		this.debY = e.getY();
    	}
     
    	public void endClicked(MouseEvent e) //On récupère les coordonnées d'arrivée (quand on relâche le clic)
    	{
    		this.finX = e.getX();
    		this.finY = e.getY();
     
    		int change;
    		if (!jb_l.isSelected())
    		{
    			if (debX>finX)
    			{
    				change = finX;
    				finX = debX;
    				debX = change;
    			}
    			if (debY>finY)
    			{
    				change = finY;
    				finY = debY;
    				debY = change;
    			}
    		}
     
    		if (jb_s.isSelected())
    		{
    			this.o.add(new Rectangle(debX, debY, finX - debX, finY - debY, this.pointerSize, this.pointerColor, 0));
    		}
    ...
    		else if (jb_l.isSelected())
    		{
    			this.o.add(new Line(debX, debY, finX, finY, this.pointerSize, this.pointerColor));
    		}
     
    		repaint();
    	}

    Voili voulou, j'espère que vous pourrez nous aider, si il existe une solution un peu plus propre et efficace que celle que nous avons déjà envisagée...

    Merci et bon dimanche

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Il faut dessiner dans un JPanel, et mettre le MouseListener sur le JPanel, et non sur la JFrame.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut
    A vrai dire les MouseListener sont placés sur le JLabel qui contient l'image, pas sur la JFrame.

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par SynRJ Voir le message
    A vrai dire les MouseListener sont placés sur le JLabel qui contient l'image, pas sur la JFrame.
    Utilise un JPanel au lieu d'un JLabel. Ca évitera de calculer les Border et le décalage automatique sur l'icône pour centrer l'image.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut
    Entendu merci, je vais essayer cela ce soir. Je vous tiens au courant !

  6. #6
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut
    Alors voila, j'ai écrit une classe ImagePanel :

    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
     
    public class ImagePanel extends JPanel
    {
    	private Image image;
     
    	public ImagePanel(Image i)
    	{
    		this.image = i;
    	}
     
    	public void paintComponent(Graphics g)
    	{
    		super.paintComponent(g);
                    int height = this.getSize().height;
                    int width = this.getSize().width;  
                    g.drawImage(image, 0, 0, width, height, this);
            }
     
            public void setImage(Image i)
            {
            	this.image = i;
        	}
    }
    J'ai aussi ajouté les listeners sur le JPanel, mais maintenant je ne vois plus les dessins que j'effectue.
    J'ai ajouté ces deux lignes dans la méthode paint de mon premier message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    this.p_image.setImage(bimage);
    this.p_image.paintComponent(g);
    En laissant la première ligne, l'image ne s'affiche plus.
    Avec seulement la deuxième, je ne vois pas mes dessins.

    (Ah oui j'ai peut-être oublié de préciser, mais je dessine sur des images...)

Discussions similaires

  1. problème de dessin dans une fenêtre
    Par Mat 74 dans le forum Windows
    Réponses: 8
    Dernier message: 12/04/2007, 11h44
  2. Problème de dessin d'une cour
    Par franc82 dans le forum OpenGL
    Réponses: 3
    Dernier message: 20/02/2007, 09h28
  3. Problème de dessin sur une form
    Par Alchemist dans le forum Delphi
    Réponses: 7
    Dernier message: 27/01/2007, 22h10
  4. Problème de dessins de boutons
    Par guipom dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 06/01/2007, 16h19
  5. Réponses: 7
    Dernier message: 04/06/2006, 17h00

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