IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

[Thread] arreter un thread avec un Mouselistener


Sujet :

AWT/Swing Java

  1. #1
    Membre actif Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Points : 254
    Points
    254
    Par défaut [Thread] arreter un thread avec un Mouselistener
    Bonjour,
    j'essaie d'arreter un thread via un mouselistener.
    Le problème est qu'il reste un parti du programme actif lorsque je l'arrete. J'ai très certainement fais un bourde sur l'utilisation du thread mais j'arrive pas à trouver où...

    code du gestionnaire de l'appli:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
     
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
     
    import java.util.LinkedList;
    import java.util.List;
     
    import javax.media.Time;
     
    import com.thoughtworks.xstream.XStream;
    import com.thoughtworks.xstream.io.xml.DomDriver;
     
    public class GestBorne implements Runnable{
    	private ObjDiaporama		diaporama=null;
    	private List<ObjDiapo> 		listDiapo=null;
    	private String				fichier="diaporama.xml";
    	private IHMVisu				ihm=null;
    	private Thread				th=null;
    	private List<PanelVisu> 	listPanel=null;
    	private PanelVisu			panel=null;
    	private long				duree=0;
    	private boolean 			visu=true;
    	private FileInputStream 	fis=null;
    	private XStream				xstream=null;
     
    	public static void main(String args[]){
    		new GestBorne();
    	}
     
    	public GestBorne(){
    		diaporama=this.chargerDiaporama();
    		listDiapo=diaporama.getListDiapo();
    		th=new Thread(this);
    		listPanel=this.chargerListpanel(diaporama);
    		ihm=new IHMVisu(this);
    		this.th.start();
    	}
     
    	@SuppressWarnings("static-access")
    	@Override
    	public void run() {
    		while(visu){
    			if(!(diaporama.equals(this.chargerDiaporama()))){
    				diaporama=this.chargerDiaporama();
    				listPanel=this.chargerListpanel(diaporama);
    			}
    			for(int cpt=0;cpt<listPanel.size();cpt++){
    				if(visu){
    					panel=listPanel.get(cpt);
    					ihm.setContentPane(panel);
    					ihm.validate();
    					duree=panel.getDuree()*1000;
    					try {
    						if(panel!=null){
    							if(panel.getClass().equals(PanelMedia.class)){
    								((PanelMedia) panel).getPlayer().setMediaTime(new Time (0));
    								((PanelMedia) panel).getPlayer().start();
    							}
    							this.th.sleep(duree);
    							if(panel.getClass().equals(PanelMedia.class)){
    								((PanelMedia) panel).getPlayer().stop();						
    							}
    						}
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				}else{
    					cpt=listPanel.size();
    				}
    			}
    		}
    		this.listDiapo=null;
    		this.listPanel=null;
    		this.th=null;
    		this.ihm=null;
    	}
     
    	private ObjDiaporama chargerDiaporama(){
    		ObjDiaporama diaporamaCharger=null;
    		try {
    			fis=new FileInputStream(new File(fichier));
    			xstream = new XStream(new DomDriver());
    			try{
    				diaporamaCharger=(ObjDiaporama) xstream.fromXML(fis);
    				listDiapo=diaporamaCharger.getListDiapo();
    			}finally{
    				fis.close();
    			}
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		}catch(IOException ioe){
    			ioe.printStackTrace();
    		}
    		return diaporamaCharger;
    	}
     
    	private List<PanelVisu> chargerListpanel(ObjDiaporama diaporamaACharger){
    		List<PanelVisu> list=new LinkedList<PanelVisu>();
    		ObjDiapo diapoCharger=null;
    		for(int cpt=0;cpt<diaporamaACharger.getListDiapo().size();cpt++){
    			diapoCharger = diaporamaACharger.getListDiapo().get(cpt);
    			if(diapoCharger.getType().compareTo("Page Web")==0){
    				list.add(new PanelHTML(diapoCharger));
    			}else if(diapoCharger.getType().compareTo("Video")==0){
    				list.add(new PanelMedia(diapoCharger));
    			}else if(diapoCharger.getType().compareTo("Images")==0){
    				list.add(new PanelImage(diapoCharger));
    			}
    		}
    		return list;
    	}
     
    	public synchronized void setVisu(boolean b) {
    		visu=b;
    	}
    }
    Code de l'interface graphique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    import java.awt.BorderLayout;
    import java.awt.Toolkit;
    import java.awt.event.MouseEvent;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    @SuppressWarnings("serial")
    public class IHMVisu extends JFrame {
    	private GestBorne 		gestionnaire=null;
    	private IHMListener 	ecouteur=null;
    	private JPanel 			jContentPane=null;
     
    	public IHMVisu(GestBorne gest){
    		super();
    		this.gestionnaire=gest;
    		this.setUndecorated(true);
    		this.setSize(Toolkit.getDefaultToolkit().getScreenSize());
    		this.setContentPane(this.getJContentPane());
    		this.addMouseListener(this.chargerListener());
    		this.setVisible(true);
    	}
     
    	private IHMListener chargerListener() {
    		if(ecouteur==null){
    			ecouteur=new IHMListenerAdapter(){
    				@Override
    				public void mouseClicked(MouseEvent e){
    					IHMVisu.this.gestionnaire.setVisu(false);
    					IHMVisu.this.gestionnaire=null;
    					IHMVisu.this.dispose();
    				}
    			};
    		}
    		return ecouteur;
    	}
     
    	private JPanel getJContentPane() {
    		if(jContentPane==null){
    			jContentPane=new JPanel();
    			jContentPane.setLayout(new BorderLayout());
    		}
    		return jContentPane;
    	}
    }
    Merci d'avance!
    La javaDoc est mon amie, elle est la tienne aussi!

  2. #2
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 493
    Points
    15 493
    Par défaut
    Bien que ce ne soit probablement pas l'origine de ton problème, il faudrait que tu déclares visu en private volatile boolean. Parfois le compilateur peux optimiser en remplacant par des constantes les variables qui ne sont pas modifiables par le thread en cours.
    Le volatile indique que la variable peut être modifié par n'importe quel thread, ce qui évite ce genre d'optimisations.

    Sinon pourrais tu préciser ce que tu entends par "Le problème est qu'il reste un parti du programme actif lorsque je l'arrete". De quelle partie s'agit il? Le thread que tu essaie de terminer est il bien terminé?

  3. #3
    Membre actif Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Points : 254
    Points
    254
    Par défaut
    Arf, je suis un idiot... j'ai pas mis de "System.exit(0)"... donc forcement je sort pas vraiment du programme et donc j'ai toujours un jawa.exe actif...
    Y'as des fois on cherche compliqué alors que c'est tout simple
    La javaDoc est mon amie, elle est la tienne aussi!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/10/2005, 12h58
  2. [Thread] comment arreter un thread qui execute une methode b
    Par Cyber@l dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 04/08/2004, 10h51
  3. j'arrive pas a arreter mon thread d'arriere-plan
    Par ms91fr dans le forum Langage
    Réponses: 6
    Dernier message: 06/06/2003, 21h36
  4. probleme a l'arret de threads
    Par Sei dans le forum C++Builder
    Réponses: 5
    Dernier message: 16/12/2002, 12h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo