dulbala
Messages postés9Date d'inscriptionmardi 25 août 2009StatutMembreDernière intervention 6 octobre 2009
-
2 oct. 2009 à 00:08
dulbala
Messages postés9Date d'inscriptionmardi 25 août 2009StatutMembreDernière intervention 6 octobre 2009
-
6 oct. 2009 à 20:54
[b]Bonjour,
je tente en vain de rafraichir une image en utilisant repaint(), mais rien ne se passe (paint_component n'est jamais appelé).
J'utilise un thread qui télécharge une image et qui est censé la mettre à jour
ci-joint le thread "Acquisition_video" permettant le téléchargement et l'affichage de l'image, ainsi qu'un extrait du code de génération de la fenêtre et du lancement du thread.
public class Acquisition_video extends JLabel implements Runnable
{
private DataInputStream Entree_video_in;
private ImageIcon image;
byte[] buffer_image = new byte[100000];
public Acquisition_video(DataInputStream entree)
{
//Connexion Video port 9101
Entree_video_in=entree;
}
public void run()
{
byte[] entete = new byte[4];
byte[] longueur = new byte[2];
int lg1;
int lg2;
int lg;
try
{
while(true)
{
System.out.println ("Acquisition video");
//Lecture entete de type B0B0D000
//byte[] entete = new byte[4];
Entree_video_in.readFully(entete);
//Lecture du nombre d'octets de l'image
//byte[] longueur = new byte[2];
Entree_video_in.readFully(longueur);
lg1=((longueur[1]&0xff)<<8);
lg2=longueur[0]& 0xff;
lg = lg1+lg2;
uhrand
Messages postés491Date d'inscriptionsamedi 20 mai 2006StatutMembreDernière intervention15 juillet 20129 3 oct. 2009 à 04:53
Si tu n'entre pas dans paintComponent(), c'est que le composant n'est pas visible. Tu peux faire le test en ajoutant qulequechose comme ceci:
System.out.println(isVisible());
dulbala
Messages postés9Date d'inscriptionmardi 25 août 2009StatutMembreDernière intervention 6 octobre 2009 3 oct. 2009 à 10:54
En executant System.out.println(isVisible()), j'ai le retour 'true'
Par contre, en en executant
System.out.println(isShowing() + " " + getClass().getName());
Component parent = getParent();
while (parent != null)
{
System.out.println(parent.isShowing() + " " + parent.getClass().getName());
parent = parent.getParent();
}
j'ai le retour false (parent est toujours égal à null).
je précise que j'ai fait ces tests en plaçant ces lignes de commandes dans la méthode run() de la classe "Acquisition_video"
uhrand
Messages postés491Date d'inscriptionsamedi 20 mai 2006StatutMembreDernière intervention15 juillet 20129 3 oct. 2009 à 12:36
Cela confirme ce que je disais: tu n'entre pas dans paintComponent(), parceque le composant est invisible (il n'appartient même pas à une fenêtre visible, car il n'a aucun parent).
Conclusion: tu as créé deux instances du même composant: un des deux est visible à l'écran et l'autre est invisible. Tu fais les repaint() sur celui qui est invisible: c'est pas étonnant qu'il ne se passe rien à l'écran!
dulbala
Messages postés9Date d'inscriptionmardi 25 août 2009StatutMembreDernière intervention 6 octobre 2009 3 oct. 2009 à 13:46
D'accord mais je ne vois pas où je crée 2 instances du même composant.
J'ai une classe principale ("Fenetre" dans mon programme) dans laquelle j'ai créer mon panel et les différents éléments graphiques, et j'ai le Thread "Acquisition video" dans lequel j'essaie de rafraichir une image).
J'en déduit qu'un argument passe mal lors du lancement du Thread chargé de rafraichir l'image, mais je ne vois pas ...
Quand tu parles de 2 instances du même composant, tu parles de l'image ou du panel complet?
dulbala
Messages postés9Date d'inscriptionmardi 25 août 2009StatutMembreDernière intervention 6 octobre 2009 3 oct. 2009 à 17:38
En effet, en ayant une seule instance, le code :
System.out.println(isShowing() + " " + getClass().getName());
Component parent = getParent();
while (parent != null)
{
System.out.println(parent.isShowing() + " " + parent.getClass().getName());
parent = parent.getParent();
}
uhrand
Messages postés491Date d'inscriptionsamedi 20 mai 2006StatutMembreDernière intervention15 juillet 20129 3 oct. 2009 à 18:51
Il y a trois possiblités:
1. le composant se trouve dans un ScrollPane visible mais le composant n'est actuellement pas dans le view port du ScrollPane,
2. le composant est caché par un autre composant ou Container.
3. il y a un problème dans painComponent: tu peux facilement vérifier si paintComponent n'est vraiment pas exécutée en ajoutant ceci à l'intérieur de la méthode paintComponent:
System.out.println("paintComponent a été exécutée");
dulbala
Messages postés9Date d'inscriptionmardi 25 août 2009StatutMembreDernière intervention 6 octobre 2009 3 oct. 2009 à 20:20
Pour le point 3, je suis sûr que paintComponent n'est pas appelé.
Pour les points 1 ou 2, comment savoir ?
Ce que je ne comprend pas, c'est qu'en utilisant en seul Thread (en gérant l'affichage dans la Class Fenetre), j'arrive à rafraichir mon image.
Je suis embêté depuis que j'ai crée un autre thread (Acquistion video).
Autre point que je ne comprend pas, c'est que lorsque je lorsque je fait un extends JPanel au lieu de extends JLabel, le repaint() appelle paint_component, mais l'image n'est pas rafraichie.
dulbala
Messages postés9Date d'inscriptionmardi 25 août 2009StatutMembreDernière intervention 6 octobre 2009 6 oct. 2009 à 20:54
Le problème est partiellement réglé en définissant la taille dans paint_component et en faisant un extends JPanel.
Néanmoins, il me colle l'image juste après les boutons et elle est à moitié bouffée . Je pense que le pb vient du fait qu'au moment de réserver l'emplacement pôur l'image, il voit qu'elle a une taille nulle.
N'ayant pas réussi à la placer où le voulais, j'ai finalement résolu mon problème avec VEP (sous eclipse) qui gère l'interface graphique bien mieux que moi.