Resolu repaint n'appele pas paintcomponentt

Resolu repaint n'appele pas paintcomponentt - Java - Programmation

Marsh Posté le 20-02-2018 à 09:49:49    

Bonjour,
  Je suis débutant et je coince sur mon programme.
Mon problème est que j'essaie de tracer une courbe (trajectoire dans mon cas) dans un panel mais la classe paintcomponent n'est jamais appelé sauf la première fois lorsque je créé mon panel
 Mon code est

Code :
  1. Calcul nouvelleEtude = new Calcul(this.vitesse,this.angle,this.hauteur,this.dt,this.masse,this.k, etude);
  2.  // affichage des résultat dans un tableau compris dans des onglets avec couleur différentes à chaque étude
  3.  String  title[] = {"T (s)", "X (Mètre)","Y (Mètre)","Vx (m/s)","Vy (m/s)"," V (m/s)"};
  4.  JTable tableau = new JTable (nouvelleEtude.getData(),title);
  5.  tableau.setBackground(couleur[nouvelleEtude.getNombreEtude()-1]);
  6.  onglet.add("Courbe n° "+(nouvelleEtude.getNombreEtude()), new JScrollPane(tableau));
  7.  onglet.setFont(font1);
  8.  onglet.setSelectedIndex(nouvelleEtude.getNombreEtude()-1);
  9.  affichage.add(onglet);
  10.  //affichage de la trajectoire dans des onglets avec couleur différentes à chaque étude
  11.  Panneau courbe = new Panneau();
  12.  courbe.setBackground(couleur[nouvelleEtude.getNombreEtude()-1]);
  13.  ongletCourbe.add("Courbe n° "+(nouvelleEtude.getNombreEtude()),courbe);
  14.  ongletCourbe.setSelectedIndex(nouvelleEtude.getNombreEtude()-1);
  15.  afficheCourbe.add(ongletCourbe);
  16.  // affichage des differents coefficients résultant des parametres
  17.  info.setText( "\n\n                         Projectile : "+ choixProjectile.getSelectedItem()
  18.                +"\n                         Etude : "+choixEtude.getSelectedItem()
  19.                +"\n  Masse volumique                     : "+this.p
  20.                +"\n  Nombre de reynolds                : "+this.re
  21.          +"\n  Coéfficient de pénetration Cx : "+this.cx
  22.          +"\n  Coéfficient K                         : "+this.k
  23.          +"\n\n                         Courbe N° : "+nouvelleEtude.getNombreEtude());
  24.  info.repaint();
  25.  // Tracer la courbe point par point
  26.    float y= 229/(nouvelleEtude.getyMax()*1.1f);
  27.    float x = 780/(nouvelleEtude.getxMax()*1.1f);
  28.    float x1,x2,y1,y2;
  29.    int j = 0;
  30.    do {
  31.     x1 = 20f +(float) tableau.getValueAt(j, 1);
  32.     x2 = 20f +(float) tableau.getValueAt(j+1, 1);
  33.     y1 = 20f+ (float) tableau.getValueAt(j, 2);
  34.     y2 = 20f +(float) tableau.getValueAt(j+1, 2);
  35.     courbe.setPosX((int)x1);
  36.     courbe.setPosY((int)y1);
  37.     courbe.setPosX2((int)x2);
  38.     courbe.setPosY2((int)y2);
  39.     courbe.repaint();
  40.         try {
  41.           Thread.sleep(10);
  42.         } catch (InterruptedException e) {
  43.           e.printStackTrace();
  44.         }
  45.     j++;
  46.    }while (y2>20);


et ma classe panneau est

Code :
  1. public class Panneau extends JPanel {
  2.    private float posX = 100;
  3.   private float posY = 100;
  4.   private float posX2 = -50;
  5.   private float posY2 = -50;
  6.   public void paintcomponent(Graphics g){
  7.  super.paintComponent(g);
  8.  Graphics2D g2 = (Graphics2D) g;
  9.     g2.setColor(Color.red);
  10.     g2.drawOval((int) posX, (int) posY, 50, 50);
  11.     g2.draw(new Line2D.Float(posX, posY, posX2, posY2));
  12.   }
  13.   public float getPosX() {
  14.     return posX;
  15.   }
  16.   public void setPosX(float x1) {
  17.     this.posX = x1;
  18.   }
  19.   public float getPosY() {
  20.     return posY;
  21.   }
  22.   public void setPosY(float posY) {
  23.     this.posY = posY;
  24.   }
  25. /**
  26. * @return the posX2
  27. */
  28. protected float getPosX2() {
  29. return posX2;
  30. }
  31. /**
  32. * @param posX2 the posX2 to set
  33. */
  34. protected void setPosX2(float posX2) {
  35. this.posX2 = posX2;
  36. }
  37. /**
  38. * @return the posY2
  39. */
  40. protected float getPosY2() {
  41. return posY2;
  42. }
  43. /**
  44. * @param posY2 the posY2 to set
  45. */
  46. protected void setPosY2(float posY2) {
  47. this.posY2 = posY2;
  48. }       
  49. }


 
Malgré mes recherches, je suis bloqué.
Pour info j'utilise Box comme Layout et j'ai l'impression que cela vient peut être de cela.
 
Je remercie d'avance toutes les personnes qui peuvent m'aider


Message édité par lolo1971 le 25-02-2018 à 08:07:03
Reply

Marsh Posté le 20-02-2018 à 09:49:49   

Reply

Marsh Posté le 20-02-2018 à 13:42:59    

je viens de m'apercevoir que l'affichage du tableau des données se faisaient après la boucle du tracer point par point
 
alors que ( il me semble) l'affichage doit se faire puis le tracé de la courbe et non l'inverse.
 
Est-ce qu'il y a une méthode pour forcer l'affichage du tableau avant la courbe ?
j'ai essayé avec updateUi et repaint mais cela ne marche pas

Reply

Marsh Posté le 21-02-2018 à 11:24:18    

Avec Graphics cela fonctionne mais pas avec Graphics2D
Je ne comprends pas
Est-ce qu'il y a quelqu'un qui peut m'aider
merci

Reply

Marsh Posté le 23-02-2018 à 11:18:19    

Le problème du tracé de courbe est résolu. Voila mon code

Code :
  1. @Override
  2. public  void paintComponent(Graphics g1){
  3.     super.paintComponents(g1);
  4.   Graphics2D g = (Graphics2D) g1;
  5.   super.paintComponents(g);
  6.   g.drawRect(0, 0, 100, 100);
  7.   g.drawString("courbe", 100, 100);
  8.   g.setBackground(Color.cyan);
  9.      g.setColor(Color.red);
  10.      g.draw(new Line2D.Float(posX, posY, posX2, posY2));
  11.   }
  12.   public float getPosX() {
  13.     return posX;
  14.   }
  15.   public void setPosX(float x1) {
  16.     this.posX = x1;
  17.   }
  18.   public float getPosY() {
  19.     return posY;
  20.   }
  21.   public void setPosY(float posY) {
  22.     this.posY = posY;
  23.   }
  24. /**
  25. * @return the posX2
  26. */
  27. protected float getPosX2() {
  28. return posX2;
  29. }
  30. /**
  31. * @param posX2 the posX2 to set
  32. */
  33. protected void setPosX2(float posX2) {
  34. this.posX2 = posX2;
  35. }
  36. /**
  37. * @return the posY2
  38. */
  39. protected float getPosY2() {
  40. return posY2;
  41. }
  42. /**
  43. * @param posY2 the posY2 to set
  44. */
  45. protected void setPosY2(float posY2) {
  46. this.posY2 = posY2;
  47. }       
  48. }

 

Code :
  1. private  void traceCourbe(float xMax, float yMax, JTable tableau) {
  2.  new Thread(new Runnable(){
  3.   public void run(){
  4.    afficheCourbe.removeAll();
  5.    afficheCourbe.updateUI();
  6.    Panneaubis courbe = new Panneaubis();
  7.    afficheCourbe.add(courbe);
  8.    //afficheCourbe.validate();
  9.    //afficheCourbe.revalidate();
  10.    //afficheCourbe.repaint();
  11.    afficheCourbe.updateUI();
  12.    // Tracer la courbe point par point
  13.     float y= 220/(yMax*1.1f);
  14.     float x = 800/(xMax*1.1f);
  15.     System.out.println("x=: "+x+"y= : "+y+"  "+xMax+ "    "+yMax);
  16.     SwingWorker sw = new SwingWorker(){
  17.       protected Object doInBackground() throws Exception {
  18.        float x1,x2,y1,y2;
  19.        int j = 0;
  20.        do {
  21.                     x1 = 20f +(float) tableau.getValueAt(j, 1)*x;
  22.                  x2 = 20f +(float) tableau.getValueAt(j+1, 1)*x;
  23.                  y1 = 220 - (float) tableau.getValueAt(j, 2)*y;
  24.                  y2 = 220 -(float) tableau.getValueAt(j+1, 2)*y;
  25.         System.out.println(x1+"  "+x2+"  "+y1+"  "+y2);
  26.                  courbe.setPosX(x1);
  27.         courbe.setPosY(y1);
  28.         courbe.setPosX2(x2);
  29.         courbe.setPosY2(y2);
  30.         courbe.validate();
  31.         courbe.revalidate();
  32.         courbe.repaint();
  33.             try {
  34.               Thread.sleep(100);
  35.             } catch (InterruptedException e) {
  36.               e.printStackTrace();
  37.             }
  38.         j++;
  39.         //System.out.println(courbe.getPosX()+"     "+courbe.getPosX2()+"      "+courbe.getPosY()+"     "+courbe.getPosY2());
  40.        }while (y2>20);
  41.        return null;
  42.                 }
  43.       public void done(){
  44.        courbe.updateUI();
  45.              if(SwingUtilities.isEventDispatchThread())
  46.                System.out.println("Dans l'EDT ! " );
  47.                courbe.repaint();
  48.            }       
  49.          };
  50.          sw.execute();
  51.       return;
  52.   }
  53.  }).start();
  54. }


mais dans mon panel apparait le reste de l’écran (en fond de JPanel)lorsque le tracé se fait  
 
 

Reply

Marsh Posté le 23-02-2018 à 12:16:47    

Salut
 
Je suis étonné que tu n'aies pas eu d'aide, en général j'en ai toujours !
 
Je débute en Java moi aussi
 
Tu vois le bureau de windows dans ton panel ?
 
Moi j'ai ça dans ma classe panneau (qui extend jpanel), tu l'as ?
 

Code :
  1. public void paintComponent(Graphics g){
  2.    
  3.     g.setColor(Color.white);
  4.     g.fillRect(0, 0, this.getWidth(), this.getHeight());


---------------
Mes apps  |  Viens coder  |  Mon topal de vente
Reply

Marsh Posté le 23-02-2018 à 13:40:47    

Salut
  Avec fillRect, le problème ne se pose pas  
Le panel se met bien à la couleur
Je ne le met pas car je ne veux pas effacer les lignes faites pour afficher ma courbe
Ma fenêtre comporte plusieurs box et ils apparaissent dans mon panel lorsque je l'appelle  
Apparemment il n'y a pas grand monde qui peut m'aider
Merci pour ton info
 
 
 

Reply

Marsh Posté le 23-02-2018 à 20:40:08    

Bah moi je créerais un compteur (int compteur = 0; ) incrémenté lors des repaint, puis, shématiquement :
 

Code :
  1. if (compteur = 0) {
  2.    g.setColor(Color.white);
  3.    g.fillRect(0, 0, this.getWidth(), this.getHeight());
  4. }


Message édité par Lt Ripley le 23-02-2018 à 20:41:03

---------------
Mes apps  |  Viens coder  |  Mon topal de vente
Reply

Marsh Posté le 24-02-2018 à 07:49:28    

Salut,  
J'y ai pensé et j'ai essayé mais dès que la courbe se trace
Le fond de mon jpanel change  
Je vais tenter autre chose (calcul des coordonnées en tâche de fond)
Je pense pense que cela peut venir de là mon problème
Merci ripley pour ton aide

Reply

Marsh Posté le 24-02-2018 à 13:44:43    

Salut ripley,  
 
 C'est bon mon problème est resolu
J'ai lancé dans un nouveau thread et cela fonctionne
Merci à toi

Reply

Marsh Posté le 24-02-2018 à 14:03:52    

[:nakawouet]


---------------
Mes apps  |  Viens coder  |  Mon topal de vente
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed