Probleme affichage Graphics et Graphics2D

Résolu/Fermé
lolo991971 Messages postés 3 Date d'inscription jeudi 22 février 2018 Statut Membre Dernière intervention 23 février 2018 - 22 févr. 2018 à 18:16
lolo991971 Messages postés 3 Date d'inscription jeudi 22 février 2018 Statut Membre Dernière intervention 23 février 2018 - 23 févr. 2018 à 11:04
Bonjour,
Je veux afficher une courbe selon des des données d'un tableau
Mon problème est que lorsque j'utilise Graphics la courbe se trace mais avec un fond copié des autres parties de ma fenêtre
et lorsque j'utilise Graphics2D le fond est bon mais la courbe ne s'affiche pas
public class Panneaubis extends JPanel {

private float posX = -50;
private float posY = -50;
private float posX2 = -50;
private float posY2 = -50;



public void paintcomponent(Graphics g1){
super.paintComponents(g1);
Graphics2D g = (Graphics2D) g1;
//super.paintComponents(g);
g.setColor(Color.BLACK);
g.drawRect(0, 0, 100, 100);
g.drawString("courbe", 100, 100);
g.setBackground(Color.cyan);
g.setColor(Color.red);
g.drawOval((int) posX, (int) posY, 50, 50);
g.draw(new Line2D.Float(posX, posY, posX2, posY2));
}

public float getPosX() {
return posX;
}

public void setPosX(float x1) {
this.posX = x1;
}

public float getPosY() {
return posY;
}

public void setPosY(float posY) {
this.posY = posY;
}

/**
  • @return the posX2 */protected float getPosX2() { return posX2;}/** * @param posX2 the posX2 to set */protected void setPosX2(float posX2) { this.posX2 = posX2;}/** * @return the posY2 */protected float getPosY2() { return posY2;}/** * @param posY2 the posY2 to set */protected void setPosY2(float posY2) { this.posY2 = posY2;} }


public class Panneau extends JPanel {
private int posX = -50;
private int posX2 = -50;
private int posY = -50;
private int posY2 = -50;

public void paintComponent(Graphics g){
//super.paintComponent(g);
g.setColor(Color.red);
g.fillOval(posX, posY, 20, 20);
g.drawLine(posX, posY, posX2, posY2);
g.setColor(Color.YELLOW);
g.drawLine(20, 0, 20, 300);
g.drawLine(0, 240, 1000, 240);
}

public int getPosX() {
return posX;
}

public void setPosX(int posX) {
this.posX = posX;
}

public int getPosY() {
return posY;
}

public void setPosY(int posY) {
this.posY = posY;
}

/**
  • @return the posX2 */protected int getPosX2() { return posX2;}/** * @param posX2 the posX2 to set */protected void setPosX2(int posX2) { this.posX2 = posX2;}/** * @return the posY2 */protected int getPosY2() { return posY2;}/** * @param posY2 the posY2 to set */protected void setPosY2(int posY2) { this.posY2 = posY2;} }


private void traceCourbe(float xMax, float yMax, JTable tableau){
afficheCourbe.removeAll();
afficheCourbe.updateUI();
Panneau courbe = new Panneau();
afficheCourbe.add(courbe);
// Tracer la courbe point par point
float y= 220/(yMax*1.1f);
float x = 800/(xMax*1.1f);
System.out.println("x=: "+x+"y= : "+y+" "+xMax+ " "+yMax);
int j = 0;
SwingWorker sw = new SwingWorker(){
protected Object doInBackground() throws Exception {
float x1,x2,y1,y2;
int j = 0;
do {
x1 = 20f +(float) tableau.getValueAt(j, 1)*x;
x2 = 20f +(float) tableau.getValueAt(j+1, 1)*x;
y1 = 220 - (float) tableau.getValueAt(j, 2)*y;
y2 = 220 -(float) tableau.getValueAt(j+1, 2)*y;
System.out.println(x1+" "+x2+" "+y1+" "+y2);
courbe.setPosX((int)x1);
courbe.setPosY((int)y1);
courbe.setPosX2((int)x2);
courbe.setPosY2((int)y2);
courbe.validate();
courbe.revalidate();
courbe.repaint();
courbe.setOpaque(true);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
j++;
//System.out.println(courbe.getPosX()+" "+courbe.getPosX2()+" "+courbe.getPosY()+" "+courbe.getPosY2());
}while (y2>20);
return null;
}
public void done(){
if(SwingUtilities.isEventDispatchThread())
System.out.println("Dans l'EDT ! ");
//courbe.repaint();
}
};
sw.execute();
}


je suis un peu bloqué
merci d'avance pour votre aide



2 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
23 févr. 2018 à 00:17
Bonjour,

Attention aux noms des méthodes, dans Panneaubis tu as mis
public void paintcomponent(Graphics g1){
avec un c minuscule à component, or la méthode de surcharge c'est avec un C majuscule (c'est du CamelCase), donc la méthode que tu as écrite ne surcharge rien du tout et n'est jamais appelée...

Un moyen de voir ce genre d'erreur est de systématiquement ajouter l'annotation @Override sur les méthodes que tu surcharges, ce qui te permet de vérifier que c'est effectivement bien une surcharge.

PS. Graphics2D extends Graphics et en l'occurence ici tu auras toujours un Graphics2D donc ça ne sert pas à grande chose de faire tantôt un code pour Graphics tantôt pour Graphics2D alors qu'au final tu n'auras que du Graphics2D.
0
lolo991971 Messages postés 3 Date d'inscription jeudi 22 février 2018 Statut Membre Dernière intervention 23 février 2018
23 févr. 2018 à 07:24
Bonjour,

Je me sens tout bête sur ce coup là.

Je n'ai pas vu cette erreur toute bête.
Je n'utilise pas les deux , j'ai fait deux classes pour tester mon programme, à terme, je n'utilise que graphics2D (il accepte des valeurs float et double).

Je vais voir tout à l'heure si avec Graphics2D, j'ai toujours le fond de mon jpanel qui ressemble au reste de la fenêtre ou sinil est bien de la couleur définie
Merci beaucoup
0
lolo991971 Messages postés 3 Date d'inscription jeudi 22 février 2018 Statut Membre Dernière intervention 23 février 2018
23 févr. 2018 à 11:04
rebonjour,
La courbe se trace bien mais voila ce que j'obtiens dans l’écran

Mon code est
private  void traceCourbe(float xMax, float yMax, JTable tableau) {
		new Thread(new Runnable(){
			public void run(){
				afficheCourbe.removeAll();
				afficheCourbe.updateUI();
				Panneaubis courbe = new Panneaubis();
				afficheCourbe.add(courbe);
				//afficheCourbe.validate();
				//afficheCourbe.revalidate();
				//afficheCourbe.repaint();
				afficheCourbe.updateUI();
				// Tracer la courbe point par point
					float y= 220/(yMax*1.1f);
					float x = 800/(xMax*1.1f);
					System.out.println("x=: "+x+"y= : "+y+"  "+xMax+ "    "+yMax);
					SwingWorker sw = new SwingWorker(){
						 protected Object doInBackground() throws Exception {
							 float x1,x2,y1,y2;
							 int j = 0;
								do {
				            	    x1 = 20f +(float) tableau.getValueAt(j, 1)*x;
					            	x2 = 20f +(float) tableau.getValueAt(j+1, 1)*x;
					            	y1 = 220 - (float) tableau.getValueAt(j, 2)*y;
					            	y2 = 220 -(float) tableau.getValueAt(j+1, 2)*y;
									System.out.println(x1+"  "+x2+"  "+y1+"  "+y2);
					            	courbe.setPosX(x1);
									courbe.setPosY(y1);
									courbe.setPosX2(x2);
									courbe.setPosY2(y2);
									courbe.validate();
									courbe.revalidate();
									courbe.repaint();
							      try {
							        Thread.sleep(100);
							      } catch (InterruptedException e) {
							        e.printStackTrace();
							      }
									j++;
									//System.out.println(courbe.getPosX()+"     "+courbe.getPosX2()+"      "+courbe.getPosY()+"     "+courbe.getPosY2());
								}while (y2>20);
								return null;
			            		}
						 public void done(){
							 courbe.updateUI();
						        if(SwingUtilities.isEventDispatchThread())
						          System.out.println("Dans l'EDT ! ");
						          courbe.repaint();
						      }         
						    };
						    sw.execute();
							return;
			}
		}).start();
	}

public class Panneaubis extends JPanel {

  private float posX = -50;
  private float posY = -50;
  private float posX2 = -50;
  private float posY2 = -50;



  @Override
public  void paintComponent(Graphics g1){
	  	 super.paintComponents(g1);
		 Graphics2D g = (Graphics2D) g1;
		 super.paintComponents(g);
		 g.drawRect(0, 0, 100, 100);
		 g.drawString("courbe", 100, 100);
		 g.setBackground(Color.cyan);
	     g.setColor(Color.red);
	     //g.drawOval((int) posX, (int) posY, 50, 50);
	     g.draw(new Line2D.Float(posX, posY, posX2, posY2));

  }

j'ai essayé comme vous pouvez le voir update, revalidate, validate et repaint mais le contenu apparait toujours lorsque la courbe se dessine mais pas avant

merci pour votre aide
0