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

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Points : 3
    Points
    3
    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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    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
    Candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Points : 3
    Points
    3
    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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    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
    Candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Entendu merci, je vais essayer cela ce soir. Je vous tiens au courant !

  6. #6
    Candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Points : 3
    Points
    3
    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...)

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    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 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Alors, utiliser un JPanel ne dispense pas mais alors pas du tout de faire un calcul de remise en place des coordonnees a cause du Border. Il faut bien sur penser a recuperer l'Insets du composant qui contient les espaces pris par les 4 cotes de la bordure. Evidement puisque ce composant montre ici n'a pas de bordure le calcul reviendrai au meme, juste qu'il ne faudra pas s'etonne si plus tards lorsqu'on rajoute un joli EtchedBorder ou BevelledBorder autour de la zone de dessin, le positionnement de la souris n'est plus correct.

    Et quelle taille elle fait cette image ? Et le paint() il sort d'ou (c'est une surcharge de quelle classe ?)?
    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

  8. #8
    Candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Le paint vient de JFrame.
    Donc si je comprend bien je n'ai pas d'autre choix que de récuperer "l'insets" (comment faire ? =/) et recalculer la position de chaque pixel lors du dessin ?

  9. #9
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    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 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Au moment de l'affichage de l'image et de la gestion des clics oui. Mais comme indique, cela n'influe pas dans le cas present ou le panel n'a pas de bordure (insets = 0, 0, 0, 0).

    Ton probleme vient sans doute que tu gere mal le positionnement de ton panel dans ta frame et que tu ne lui a pas affecte de taille. Il vaut mieux simplifier tout ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Main extends JFrame {
     
    [...]
    canvas = new MyJCanvas(image);
    setLayout(new BorderLayout());
    add(canvas, BorderLayout.CENTER)); 
    [...]
     
    }
    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
    public class MyJCanvas extends JPanel {
     
      private BufferedImage image;
     
      public MyJCanvas(BufferedImage image) {
        super();
        setImage(image);
      }
     
      public void setImage(BufferedImage newValue) {
        BufferedImage oldValue = image;
        image = newValue;
        firePropertyChangeEvent("image", oldValue, newValue);
        calculatePreferredSize();
        repaint();
      }
     
      private void calculatePreferredSize() {
        Insets insets = getInsets();
        width = (image == null) ? 200 : image.getWidth();
        height = (image == null) ? 200 : image.getHeight();
        Dimension size = new Dimension(width + insets.left + insets.right, height + insets.top + insets.bottom);
        setMinimumSize(size);
        setPreferredSize(size);
      }
     
      @Override
      protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Insets insets = getInsets();
        Dimension size = getSize();
        int width = size.width - (insets.left + insets.right);
        int height = size.height - (insets.top + insets.bottom);
        if (width > 0 && height > 0 && image != null)  {   
          Graphics2D g2d = (Graphics2D)g.create(insets.left, insets.top, width, height);
          try {
            g2d.drawImage(image, 0, 0, null);
          }
          finally {
            g2d.dispose();
          }    
        }
      }
     
      [...]
      // Gestion de la souris ici.
      Insets insets = getInsets();
      int x = event.getX() - insets.left;
      int y = event.getX() - insets.top;
      if (image != null && x >= 0 && x < image.getWidth() && y >= 0 && y < image.getHeight()) {
        [...]
        repaint();
      }
     
    }
    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

  10. #10
    Candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    D'accord merci, j'essayerai ça ce soir et je vous tiens informé

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