Methode paint appelée mais qui ne peint rien

Signaler
Messages postés
37
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2004
-
Messages postés
37
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2004
-
bonjour, je me bats toujour avec mes images.
ma nouvelle question est a propos de la surdefinition de paint.

j'ai une image sur laquelle je dessine des points sur click lorsque je redemensionne ma fenetre je perd mes points.
j'ai donc surdefini la methode paint dans le JScrollPane , la fonction paint qui affiche les points est alors bien appelée mais rien ne s'affiche . ci joint le code.

package com.hicef.ctrlVisClt;
import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

/**
 * 
 *
 * Classe permettant la gestion des scrollBars
 */
class ImageScroller  extends JScrollPane 
{JPanel p;
AjoutDefaut NewDef;
public ImageScroller(Icon icon)
{
super();

JPanel p = new JPanel(new BorderLayout());

JLabel LabPlan = new JLabel(icon); 
p.add(LabPlan , BorderLayout.CENTER);

getViewport().add(p); 

JScrollBar vsb = getVerticalScrollBar();
JScrollBar hsb = getHorizontalScrollBar();

vsb.setValue(icon.getIconHeight());
hsb.setValue(icon.getIconWidth()/10);
final int largeur = icon.getIconWidth();
final int hauteur = icon.getIconHeight();

// taille a recupere dans la Base de donnéees 

NewDef = new AjoutDefaut(icon.getIconHeight(),icon.getIconWidth(),p);
MouseListener ListenerPlan =  NewDef ;
p.addMouseListener(ListenerPlan);

}

public int GetLabelHeight()
{if (p.getHeight()==0 )
return 0; 
else
return p.getHeight();
}

             //fonction paint surdefinie
public void paint(Graphics g)
{
super.paint(g);
NewDef.paint(g);
System.out.println("appel de paint");
}
}

///////////   Classe de captage de l'evenement
class AjoutDefaut implements MouseListener 
{

public AjoutDefaut(int hauteur, int largeur, JPanel p){
 
this.hauteur = hauteur;
this.largeur = largeur;
TmpPan = p;

}

private JPanel TmpPan;
private float RatioX;
private float RatioY;
private int hauteur;
private int largeur;
private int BorderH;
private int BorderW;
private float X, Y, PixX, PixY ;  
private DrawDefect ListOfDefect = new DrawDefect();

final int SizeXmm = 125;
final int SizeYmm = 64;

public void init (Graphics g)
{
//affetation du contexte graphique
ListOfDefect.SetGraphicContent(g);
}

public void setRatioX()
{
this.RatioX = (float)SizeXmm/largeur;
}
public void setRatioY()
{
this.RatioY = (float)SizeYmm/hauteur;
}

public void mouseClicked(MouseEvent me)
{
init(TmpPan.getGraphics());
setRatioX();
;		setRatioY();

// calcul des coordonnées du composant ou de la patte séléctionnée
//Si la hauteur de la zone d'affichage est plus grande que l'image
if (TmpPan.getHeight() > hauteur)
//Calcul de la bordure sur la hauteur
{
BorderH = (TmpPan.getHeight() - hauteur)/2;
PixY = Math.abs((me.getY()- hauteur)-BorderH);
System.out.println(PixY);
//System.out.println(Math.abs((me.getY()- hauteur)-BorderH)* this.RatioY);

Y = PixY * this.RatioY;
}
else
{
//System.out.println(Math.abs((me.getY()- hauteur))* this.RatioY);
PixY = Math.abs((me.getY()- hauteur));
Y = PixY * this.RatioY;
BorderH = 0;
System.out.println(PixY);
}

//		Si la largeur de la zone d'affichage est plus grande que l'image
if (TmpPan.getWidth() > largeur)
//Calcul de la bourdure sur la largeur
{
BorderW = (TmpPan.getWidth()-largeur)/2;
PixX = (me.getX()-BorderW);
//System.out.println((me.getX()-BorderW) * this.RatioX);
X = PixX * this.RatioX;
System.out.println(PixX);
}
else
{
//System.out.println((me.getX()) * this.RatioX);
PixX = me.getX();
X = PixX * this.RatioX;
System.out.println(PixX);
BorderW=0;
}
ListOfDefect.AddElement((int)X,(int)Y, me.getX()-BorderW ,me.getY()-BorderH );
//ListOfDefect.AddElement((int)X,(int)Y, (int)PixX,(int)PixY );
paint(TmpPan.getGraphics());
}

public void paint(Graphics gc) {
   //Gestion de l'affichage des défauts
   int CurrentBorderX;
   int CurrentBorderY;
   
   if (TmpPan.getHeight() > hauteur) 
   		 CurrentBorderY = (TmpPan.getHeight() - hauteur)/2;
   else
   		CurrentBorderY = 0;
   
if (TmpPan.getWidth() > largeur) 
 CurrentBorderX = (TmpPan.getWidth() - largeur)/2;
else
CurrentBorderX = 0;
   
   
   ListOfDefect.DrawPoint(CurrentBorderX, CurrentBorderY);
   }
   
public void mouseEntered(MouseEvent arg0) {	}

public void mouseExited(MouseEvent arg0) { }

public void mousePressed(MouseEvent arg0) {	}

public void mouseReleased(MouseEvent arg0) { }
}

//////////////// Classe qui dessine les, points

package com.hicef.ctrlVisClt;
import java.awt.*;
import java.awt.event.MouseEvent;

import javax.swing.*;
import java.util.*;
import javax.swing.event.*;

public class DrawDefect {
private Point Defect;

private Graphics g;
private Vector ListDefaut;

public DrawDefect()
{
//creation de la  liste des defaut
ListDefaut = new Vector();
}

public void SetGraphicContent(Graphics gc)
{
this.g = gc;
}
protected void paintComponent(Graphics gc)
{
System.out.println("fg");
}

//methode de dessin 
public void DrawPoint(int CurrentBorderX, int CurrentBorderY)
{
int nbElement = ListDefaut.size();
DefectTracer TheDefect;

for (int i = 0; i < nbElement; i++)
{
TheDefect =	(DefectTracer) ListDefaut.elementAt(i);
g.setColor(new Color(255,102,51));

g.drawOval((TheDefect.RealX + CurrentBorderX)-3 , (TheDefect.RealY + CurrentBorderY)-3 ,7,7);
System.out.println("Début");
System.out.println("real X : " + TheDefect.RealX);
System.out.println("real Y : " + TheDefect.RealY);
System.out.println("Fin");
}
}

public void AddElement(int X, int Y, int RealX, int RealY )
{ 
ListDefaut.addElement(new DefectTracer(new Point(X,Y),RealX,RealY));
}

public void RemoveElement(DefectTracer defect)
{
ListDefaut.remove(defect);
}

public boolean BdExist(DefectTracer defect)
{
//Recherche dans la BD
return true; 
}

public void GetInfoComponent(String CompId)
{
//recuperation des info sur le composant
}

/* (non-Javadoc)
 * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
 */

}

class DefectTracer
{
protected Point Defect;
protected int RealX, RealY;

DefectTracer(Point Point, int RealX, int RealY)
{
this.Defect = Point; 
this.RealX = RealX;
this.RealY = RealY;
}
}



question subsidaire, en suivant le deroulement du programme j'ai pu noté que la methode paint était sollicité quasiment en permanance , j'ai un peu peur que ca plombe les performances !!

7 réponses

Messages postés
489
Date d'inscription
vendredi 30 janvier 2004
Statut
Membre
Dernière intervention
13 mai 2009
6
Je X que t'as trops agrandis les choses!!
tu pe faire tous ca avec une seule class.
t'aurrais pu heriter du panel et surcharger sa méthode paint; je te donnerais un bout de code au plus procha possible.
Messages postés
37
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2004

Ok merci , en fait j'avais peur que ca fasse un peu trop brouillon de tt mettre ds une classe. en plus je savais pas trop comment faire se que je voulais donc on fait des erreurs ;o)

j'attends ton bout de code

merci
Messages postés
489
Date d'inscription
vendredi 30 janvier 2004
Statut
Membre
Dernière intervention
13 mai 2009
6
Voici mon code, je viens de l'ecrir et de le tester; ca marche bien:

<td class=code>

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;

public class Essai extends JFrame{
Essai(){
super(\"essai\");
setSize(200,200);
setResizable(false);
getContentPane().add(\"Center\",new Pan());
show();
}
public static void main(String[] args){
new Essai();
}
}

class Pan extends JPanel implements MouseListener{
Image arrPlan;
Vector points;
Pan(){
super();
Toolkit tk=Toolkit.getDefaultToolkit();
arrPlan=tk.getImage(\"./logo.gif\");
points=new Vector();
addMouseListener(this);
}

public void paint(Graphics g){
g.drawImage(arrPlan,0,0,this);
g.setColor(Color.red);
for(int i=0;i
Messages postés
37
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2004

bien je vais vois ce que je peux faire avec ca .

encore merci pour toi je te tiens au courant :o)
Messages postés
37
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2004

alors ca marche bien par contre quand je clique pour rajouter un point j'ai l'image ainsi que les onglets qui se redessine derriere (decalé vers le bas)

mon image etant contenu dans un Jtabbed lui même contenu dans un conteneur , contenu dans ma frame . bon je sais y avait peut etre plus simple mais ca ma premiere application graphique en java .

deuxiemement je n'ai plus les scrollbar qui s'affiche qd l'image est trop grande et ceux même si j'ai fait heriter la classe de JScrollPane et que j'ai coller le bout de code que j'avais avant.

pourais tu m'expliquais a quoi sert toolkit . En effet aupparavant j'avais mon image dans un jlabel ce qui me permettait d'avoir ses dimensions (entre autres ). Dimensions qui m'etaient utile lors du redimensionnement de la fenetre pour caluler l'affichage au bon endrot des points

jespere etre suffisemment clair :o)
Messages postés
37
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2004

ok dans le mouseclick j'ai remplacer le repainr par paint(this.getGraphics()); ce qui m'evite de dessiner 2 fois le dessin.
par contre pour les scrollbar je seche tjrs ya til un moyen de les associé au toolkit ?
Messages postés
37
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2004

par rapport a mon message precedent en fait ca marche, donc si je reprend ton exemple quand le clique , il me redessine l'integralité de ma frenetre. est il possible de faire une sorte de clear???