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

EDT/SwingWorker Java Discussion :

Création d'un bouton qui permet d'arrêter l'exécution d'un timer


Sujet :

EDT/SwingWorker Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 24
    Points : 17
    Points
    17
    Par défaut Création d'un bouton qui permet d'arrêter l'exécution d'un timer
    Bonjour
    Je suis entrain de créer une application en utilisant SWING en java.
    J'ai un bouton "start" qui permet d'exécuter un programme avec timer de quelque seconde.
    Maintenant, je souhaite créer un bouton "arret" qui permet de l' arrêter mais je ne sais pas vraiment comment le faire.

    Voila mon code:

    Classe main : cette classe permet d'instancier la classe timer et recuperer un evenement

    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
     
     
    public class main extends JFrame implements ActionListener {
     
    private PropertyChangeListener listener = new PropertyChangeListener() {
     
    		@Override
    		public void propertyChange(PropertyChangeEvent evt) {
    			switch (evt.getPropertyName()) {
     
    				case "RESPONSE":
     
                                   TextField.setText((String) evt.getNewValue());
    }
     
    .......				
     
    public static void main(String[] args) throws IOException {
     
    		main = new Main();
    		main.setVisible(true);
     
    	}
     
    public void actionPerformed(ActionEvent e) {
    Object bouton = e.getSource();
     
    if (bouton == buttonExecuteTimer) {
     
    	ProcessorTimer worker = new ProcessorTimer();
    	worker.addPropertyChangeListener(listener);
    	worker.execute();
     
    }
     
    .....
    Classe timer==>

    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
     
     
    public class ProcessorTimer extends SwingWorker<Void, Void> {
     
    .......
     
    protected Void doInBackground() throws Exception {
     
    ......
     
    TimerTask timerTask = new HealthProcessorTaskTimer(new ICallback() {
     
    			@Override
    			public void result(String result) {   
     
    				firePropertyChange("RESPONSE", null,result);
     
    		});
     
     
    		Timer timer = new Timer(true);
     
    		timer.scheduleAtFixedRate(timerTask, 0, 2000);
    		System.out.println("Lancement execution");
     
    		return null;
    	}	
    }
    Classe TIMERTASK ==>

    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
     
     
    public class ProcessorTaskTimer extends TimerTask {
    ...
     
    public void run() {
     
    		....	
     
    		this.callback.result(response.getString());
     
    		try {		
    			Thread.sleep(5000);
    		} catch (InterruptedException e) {
     
    			e.printStackTrace();
     
    		}		
    	}
     
    	public ProcessorTaskTimer() {
    		super();
    	}
    }
    Si quelqu'un a une idée, je suis preneur.
    Merci pour votre aide, Bonne journée

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Pour arrêter un java.util.Timer, utiliser sa méthode cancel(), mais...

    ...un SwingWorker est un composant qui permet d'exécuter dans un thread à part une tâche pour éviter qu'elle ne gèle l'EDT (Event Dispatch Thread=thread de Swing). Ce composant dispose déjà de ce qu'il faut pour exécuter du code dans l'EDT et hors de l'EDT. Pourquoi lancer un troisième thread pour lancer des évenements de changement de propriétés, qui, de plus, sont exploitées dans l'EDT, donc risque d'accès concurrents.

    Pour mettre à jour l'affichage en cours de tâche, utiliser les méthodes publish et process.

    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
    public class Demo {
     
    	public static void main(String[] args) {
    		new Demo();
    	}
     
    	private final JLabel labelIntermediaire;
    	private final JLabel labelFinal;
    	private final JButton startButton;
    	private final JButton stopButton;
    	private SwingWorker<String, String> swingworker;
     
    	public Demo() {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
     
    		frame.getContentPane().setLayout(new GridBagLayout());
     
    		JPanel ui = new JPanel(new GridBagLayout());
    		frame.add(ui);
     
    		labelIntermediaire = new JLabel();
    		labelFinal = new JLabel();
    		startButton = new JButton("Start");
    		stopButton = new JButton("Stop");
    		stopButton.setEnabled(false);
     
    		GridBagConstraints gbc = new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1, 1,
    				GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(3, 3, 3, 3), 0, 0);
    		ui.add(labelIntermediaire, gbc);
    		ui.add(labelFinal, gbc);
    		ui.add(startButton, gbc);
    		ui.add(stopButton, gbc);
     
    		frame.setSize(300, 400);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    		startButton.addActionListener(e -> start());
    		stopButton.addActionListener(e -> stop());
     
    		frame.addWindowListener(new WindowAdapter() {
    			public void windowClosed(java.awt.event.WindowEvent e) {
    				stop();
    			};
    		});
     
    	}
     
    	private void stop() {
    		if (swingworker!=null) swingworker.cancel(true);
    	}
     
    	private void start() {
    		startButton.setEnabled(false);
    		stopButton.setEnabled(true);
    		swingworker = new SwingWorker<String, String>() {
     
    			@Override
    			protected String doInBackground() throws Exception {
    				// simulation tâche longue
    				String result = "";
    				for (int i = 0; i < 10/*000*/; i++) {
    					result = String.valueOf(i);
    					publish(result); // publication résultat intermédiaire
    					try {
    						Thread.sleep(500);
    					} catch (InterruptedException e) {
    						Thread.currentThread().interrupt();
    						break;
    					}
    				}
    				return result;
    			}
     
    			@Override
    			protected void process(List<String> chunks) {
    				// mise à jour résultat intermédiaire
    				if (!chunks.isEmpty()) {
    					labelIntermediaire.setText(chunks.get(chunks.size() - 1));
    				}
    			}
     
    			@Override
    			protected void done() {
    				stopButton.setEnabled(false);
    				startButton.setEnabled(true);
    				labelIntermediaire.setText("");
    				if ( isCancelled()) {
    					labelFinal.setText("Tâche interrompue");
    				}
    				else {
    					try {
    						labelFinal.setText("Tâche terminée : " + get());
    					} catch (InterruptedException | ExecutionException e) {
    						e.printStackTrace();
    					}
    				}
    			}
     
    		};
    		labelFinal.setText("En cours...");
    		swingworker.execute();
    	}
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    Merci beaucoup Joel, je vais tester votre exemple.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 24
    Points : 17
    Points
    17
    Par défaut Merci
    Merci beaucoup, çà fonctionne très bien.

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

Discussions similaires

  1. Bouton qui permet l'importation de données excel
    Par Jackernel dans le forum IHM
    Réponses: 4
    Dernier message: 09/03/2010, 14h39
  2. bouton qui permet de fermer form
    Par scofield89 dans le forum C++Builder
    Réponses: 2
    Dernier message: 25/10/2009, 13h24
  3. Réponses: 2
    Dernier message: 10/09/2007, 13h03
  4. Réponses: 1
    Dernier message: 15/04/2007, 19h11
  5. bouton qui permet d'effacer un textarea
    Par thesorrow dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 26/03/2007, 15h21

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