Thread ?

Résolu/Fermé
Toto - 22 juil. 2013 à 21:01
 Toto - 23 juil. 2013 à 22:36
Bonjour,

j'ai un listener qui détecte si un objet de la JList est cliqué, cela déclenche un process

ça fonctionne très bien sauf que lorsque je sélectionne un autre objet de la JList, le JLabel s'inscrit par dessus le JLabel précédent



pannel.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent evt) {
JList pannel = (JList)evt.getSource();
if (evt.getClickCount() == 1) {
int index = pannel.locationToIndex(evt.getPoint());
String in =tab_elements[index+1];

ProcessBuilder pb = new ProcessBuilder("ffmpeg", "-y", "-i", in);
System.out.println (pb);
try{

final Process p = pb.start();
Scanner sc = new Scanner(p.getErrorStream());
Pattern durPattern = Pattern.compile("(?<=Duration: )[^,]*");
String dur = sc.findWithinHorizon(durPattern, 0);
System.out.println("Durée" +dur);

Pattern audioPattern = Pattern.compile("(?<=Audio: )[^...\n]*");
String flux_audio = sc.findWithinHorizon(audioPattern, 0);
System.out.println("Audio" +flux_audio);

final Process p1 = pb.start();
Scanner scv = new Scanner(p1.getErrorStream());
Pattern videoPattern = Pattern.compile("(?<=Video: )[^...\n]*");
String flux_video = scv.findWithinHorizon(videoPattern, 0);
System.out.println("Vidéo" +flux_video);




JLabel duration = new JLabel("Dur\u00e9e = " +dur);

duration.setBounds(350, 500, 320, 30);
Font Police_duration = new Font("Courier", Font.ITALIC, 15); // BOLD PLAIN ITALIC
panneau.add(duration);
duration.setFont(Police_duration);
duration.setForeground(Color.black);
duration.setVisible(true);
panneau.validate();

JLabel video = new JLabel("Vid\u00e9o = " +flux_video);
video.setBounds(350, 550, 3200, 30);
panneau.add(video);
video.setFont(Police_duration);
video.setForeground(Color.black);
video.setVisible(true);



JLabel audio = new JLabel("Audio = " +flux_audio);
audio.setBounds(350, 600, 3200, 30);
panneau.add(audio);
audio.setFont(Police_duration);
audio.setForeground(Color.black);
audio.setVisible(true);

}catch (Exception ffmpeg){
System.out.println ("pas d'info FFMPEG disponible");
}


}
}

});


je pense que je dois utiliser un Thread, mais je ne sais pas faire, pouvez vous m'aider ?

d'avance merci

2 réponses

kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
23 juil. 2013 à 17:35
Bonjour,

Quel est l'objet nommé "panneau" dans ton code ?

Je pense que ton principal problème est une problème d'organisation si je puis dire.
Généralement il n'est pas bon de mélanger du code UI (interface utilisateur) et du traitement pur. Ta remarque sur le "thread" entre là dedans, car effectivement tu pourrais commencer par extraire toute la partie purement traintenant pour la mettre dans une classe à part, puis l'exécuter dans un thread (attention à bien gérer un pool à coté!) de manière à ce que le traitement n'impacte pas l'interface utilisateur. En gros c'est le même principe que le développement sur Mobile, afin de ne pas faire lagger l'interface et la rendre la plus fluide possible, aucun traitement lourd = plus de 4 secondes n'est admis.

Pour revenir à ton problème de base, car externaliser ton traitement dans un thread ne résoudrera pas le soucis actuel, je pense que c'est parce que tu ajoutes des élements dans ton "panneau" au lieu de mettre à jour les éléments déjà existant (remplacement des titres, etc.). Surtout que tu les ajoutes et bound toujours au même endroit, je suppose que le pb de superposition vient donc de là.

Corrige tout ça et redis moi si tu as toujours des soucis.
Résumé:
- effectuer tout traitement hors de la couche UI (lancé dans un autre thread via un pool par exemple donc)
- mettre à jour les composants UI existant plutôt que d'en ajouter. Ou si tu veux en ajouter, penser à supprimer les anciens !
0
merci, tes explications m'ont bcp aidé, ca fonctionne maintenant...
0