Probleme d'affichage JPanel

topic1 Messages postés 7 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 4 mai 2007 - 23 juil. 2003 à 15:16
topic1 Messages postés 7 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 4 mai 2007 - 24 juil. 2003 à 17:22
je debute en programmation java j'essaye de creer dans une Jframe trois JPanel deux affichant un graphique et un troisieme contenant des boutons
mon probleme est que quand j'utilise repaint() dans les deux zones affichages le premier se dessine dans le premier JPanel mais aussi par dessus le graphique du deuxieme JPanel comment resoudre ce probleme?

voila pour l'instant ce que j'ai fait

n'hesitez pas a envoye des remarques

import javax.swing.*;
import java.awt.*;

public class test
{
public static void main(String[] args)
{
fenetre test=new fenetre("cercle");
}
}
//////////////////////////////////////////////////////////////////////class fenetre extends JFrame
{
private pan_cercle cer;
private pan_courbe cou;
private pan_bouton bou;

public fenetre(String s)
{
super(s);

addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});

getContentPane().setLayout(null);

cer = new pan_cercle(0,0,0.0005,0.005,cou);
bou = new pan_bouton(cou,cer,this);
cou = new pan_courbe(cer);

getContentPane().add(cer);
getContentPane().add(cou);
getContentPane().add(bou);

setBounds(0,0,820,620);
setVisible(true);
setResizable(false);
}

}
//////////////////////////////////////////////////////////////////////class pan_cercle extends JPanel
{
private int nombre_tour_cercle1;
private int nombre_tour_cercle2;
private double vitesse_cercle1;
private double vitesse_cercle2;
private int bout;
private pan_courbe cou;

public pan_cercle(int nombre_tour_cercle1,int nombre_tour_cercle2,double vitesse_cercle1,double vitesse_cercle2,pan_courbe cou)
{
this.cou=cou;
this.nombre_tour_cercle1=nombre_tour_cercle1;
this.nombre_tour_cercle2=nombre_tour_cercle2;
this.vitesse_cercle1=vitesse_cercle1;
this.vitesse_cercle2=vitesse_cercle2;
setBounds(5,5,395,395);
}

public int get_nombre_tour_cercle1()
{
return nombre_tour_cercle1;
}

public int get_nombre_tour_cercle2()
{
return nombre_tour_cercle2;
}

public double get_vitesse_cercle1()
{
return vitesse_cercle1;
}

public double get_vitesse_cercle2()
{
return vitesse_cercle2;
}

public int get_bout()
{
return bout;
}

public void paintComponent(Graphics g)
{
Graphics2D g2=(Graphics2D)g;
super.paintComponent(g2);

int x=(int)(Math.cos(nombre_tour_cercle1*2*Math.PI*vitesse_cercle1)*100)+200;
int y=(int)(Math.sin(nombre_tour_cercle1*2*Math.PI*vitesse_cercle1)*100)+200;
int x2=(int)(Math.cos(nombre_tour_cercle2*2*Math.PI*vitesse_cercle2)*75)+x;
int y2=(int)(Math.sin(nombre_tour_cercle2*2*Math.PI*vitesse_cercle2)*75)+y;
//int x2=(int)((Math.cos(nombre_tour_cercle2*2*Math.PI*vitesse_cercle2)*(100+(x-200)*1.4)))+200;
//int y2=(int)((Math.sin(nombre_tour_cercle2*2*Math.PI*vitesse_cercle2)*(100+(y-200)*1.4)))+200;

bout=y2;

g2.drawOval(100,100,200,200);
g2.drawLine(200,200,x,y);
g2.drawOval(x-75,y-75,150,150);
g2.drawLine(x,y,x2,y2);

nombre_tour_cercle1++;
nombre_tour_cercle2++;
repaint();
}

}
//////////////////////////////////////////////////////////////////////class pan_courbe extends JPanel
{
private pan_cercle cer;
private double temp=3;

public pan_courbe(pan_cercle cer)
{
this.cer=cer;
setBounds(405,5,395,395);
}

public void paintComponent(Graphics g)
{
Graphics2D g2=(Graphics2D)g;

if((int)(temp)%400<5)
{
super.paintComponent(g2);
g2.drawLine(1,198,398,198);
}

if(cer.get_bout()!=0)
{
g2.fillOval((int)(temp)%400-2,cer.get_bout()-2,4,4);
temp+=0.1;
}
repaint();
}

}

//////////////////////////////////////////////////////////////////////
class pan_bouton extends JPanel
{
private pan_cercle cer;
private pan_courbe cou;
private JFrame window;

pan_bouton(pan_courbe cou,pan_cercle cer,JFrame window)
{
this.window=window;
this.cer=cer;
this.cou=cou;
setBounds(5,405,790,195);

JButton demarre=new JButton("START");
add(demarre);
}

}

2 réponses

benohite Messages postés 210 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 18 décembre 2003 7
23 juil. 2003 à 15:58
bonjour,
le probleme vient de la methode repaint() que tu appelles dans chacune des methode paintComponent de tes deux panel
en effet si tu n y fais reference (a repaint() bien sur) que dans ton panel cercle alors ton graphique se dessine correctement et ta courbe reste plate ce qui est logique
en revanche si tu fais l inverse (appel de repaint uniquement dans le panel courbe) alors ton graphique ne bouge plus et ta courbe se dessine tout en restant constante car ton grahique est figé
et bien sur comme tu l as dis un appel de repaint dans les deux panel engendre deux graphiques et un point au lieu d une courbe
tu as plusieurs solutions:

soit tu cree une classe donne qui se chargera de recupere les donne du graphique pour qu elle soient exploitable par la courbe et dans ce cas il te faut faire un processus sur cet objet afin d organiser l echange:
l objet graphique ecrit les donnes et valide pour que l objet courbe puisse les lire

ou alors tu utilise un timer qui enverra un notifcation toute les econde par ex ce qui te permettra de recupere dans les deux objets la meme valeur avant traitement

voila j espere que j ai ete clair
bon courage

benohite
:big)
0
topic1 Messages postés 7 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 4 mai 2007
24 juil. 2003 à 17:22
lorsqu j'appelle la methode repaint sur les deux, le cercle se dessine sur la courbe qui se trace en dessous

pourrais tu developper un peu plus des deux solutions
merci
0
Rejoignez-nous