cs_seb87
Messages postés37Date d'inscriptionvendredi 9 janvier 2004StatutMembreDernière intervention 6 septembre 2004
-
9 juin 2004 à 09:35
cs_seb87
Messages postés37Date d'inscriptionvendredi 9 janvier 2004StatutMembreDernière intervention 6 septembre 2004
-
9 juin 2004 à 16:22
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 !!
safisoft
Messages postés489Date d'inscriptionvendredi 30 janvier 2004StatutMembreDernière intervention13 mai 20096 9 juin 2004 à 11:08
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.
cs_seb87
Messages postés37Date d'inscriptionvendredi 9 janvier 2004StatutMembreDernière intervention 6 septembre 2004 9 juin 2004 à 11:21
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)
cs_seb87
Messages postés37Date d'inscriptionvendredi 9 janvier 2004StatutMembreDernière intervention 6 septembre 2004 9 juin 2004 à 14:02
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
cs_seb87
Messages postés37Date d'inscriptionvendredi 9 janvier 2004StatutMembreDernière intervention 6 septembre 2004 9 juin 2004 à 14:37
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 ?
cs_seb87
Messages postés37Date d'inscriptionvendredi 9 janvier 2004StatutMembreDernière intervention 6 septembre 2004 9 juin 2004 à 16:22
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???