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

avec Java Discussion :

Chronomètre en java


Sujet :

avec Java

  1. #1
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 80
    Points : 43
    Points
    43
    Par défaut Chronomètre en java
    Bonjour,

    J'essaye de faire un chronomètre en java. Mon problème c'est une fois que j'appuie sur le bouton start, impossible d'appuyer sur stop ou reset, dans les actionperformed() j'ai fait un while(True) pour le bouton start.
    Est ce pour ça que ca bloque le reste?
    Comment je peux faire?
    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
     
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
    import java.awt.*;
     
    public class LesBoutons extends JPanel implements ActionListener{
        private JButton start = new JButton("Start");
        private JButton reset = new JButton("Reset");
        private JButton stop = new JButton("Stop");
     
        private Cadre  ardoise;
       boolean compt=false;
        public LesBoutons(){
            ardoise = new Cadre();
         setLayout(new BorderLayout(5, 5));
          JPanel lesBoutons = new JPanel();
          lesBoutons.add(start);
          lesBoutons.add(stop);
          lesBoutons.add(reset);
     
          add(lesBoutons, BorderLayout.NORTH);
          add(ardoise, BorderLayout.CENTER);
          start.addActionListener(this);
          stop.addActionListener(this);
          reset.addActionListener(this);
        }
         public void actionPerformed(ActionEvent e) {
          if (e.getSource().equals(start)) {
              compt=true;
               while(true){
                // ardoise.run();
                   System.out.println("demarre");
                   ardoise.run();
              }
          }
          else if (e.getSource() == reset){
              compt=false;
            System.out.println("recommencer");}
    //ardoise.arret();
          else if (e.getSource() == stop){
              compt=false;
           System.out.println("stop");}
     //ardoise.reset();
          ardoise.repaint();
        }
    }

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 978
    Points
    7 978
    Par défaut
    C'est normal, ton traitement se fait dans le thread de l'edt de swing.
    Et comme tu mets une boucle, et que tu ne pourras plus appuyez sur rien, alors ton programme va freezer.

    C'est un problème frequement posé. Et il y'a plusieurs solutions dont :

    -Un petit tutorial ici :
    http://rom.developpez.com/java-swingworker/

    -Sinon y'a aussi SwingUtilities.invokeLater qui marche bien aussi avec une thread :
    http://gfx.developpez.com/tutoriel/j...ing-threading/

    Puis peut etre :
    http://java.developpez.com/faq/gui/?...alitesAWTSwing
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 978
    Points
    7 978
    Par défaut
    En refaisant ton code vite fait (mal fait), voici a quoi ca devrait ressembler et fonctionner.
    Attention que tu px appuyez plusieur fois sur start et lancer plusieur thread donc mefiance (limite grisé les boutons pour eviter que l'user ne lancer 2 fois start).

    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
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
    import java.awt.*;
     
    public class LesBoutons extends JPanel implements ActionListener
    {
    	private JButton	start	= new JButton("Start");
    	private JButton	reset	= new JButton("Reset");
    	private JButton	stop	= new JButton("Stop");
     
    	boolean			compt	= false;
     
    	public LesBoutons()
    	{
    		//ardoise = new Cadre();
    		setLayout(new BorderLayout(5, 5));
    		JPanel lesBoutons = new JPanel();
    		lesBoutons.add(start);
    		lesBoutons.add(stop);
    		lesBoutons.add(reset);
     
    		add(lesBoutons, BorderLayout.NORTH);
    		//  add(ardoise, BorderLayout.CENTER);
    		start.addActionListener(this);
    		stop.addActionListener(this);
    		reset.addActionListener(this);
    	}
     
    	public void actionPerformed(ActionEvent e)
    	{
    		if (e.getSource().equals(start))
    		{
     
    			Thread t = new Thread()
    			{
    				public void run()
    				{
    					LesBoutons.this.start();
    				}
    			};
    			t.start();
     
    		} else if (e.getSource() == reset)
    		{
    			setCompt(false);
    			System.out.println("recommencer");
    		}
    		//ardoise.arret();
    		else if (e.getSource() == stop)
    		{
    			setCompt(false);
    			System.out.println("stop");
    		}
    		//ardoise.reset();
    		//  ardoise.repaint();
    	}
     
    	private synchronized void setCompt(boolean b)
    	{
    		compt = false;
    	}
     
    	private void start()
    	{
    		compt = true;
    		while (isCompt())
    		{
    			// ardoise.run();
    			System.out.println("demarré");
    			/*
    			 * // Ici on va imaginer que tu doivens changer un label ou une
    			 * progressbar, donc il faut un invokeLater pour toucher les element
    			 * de swing a l'interieur d'un thread qui n'est pas l'EDT.
    			 * SwingUtilities.invokeLater(new Runnable() 
    			 * { public void run() {
    			 * jLabel.setText("balbalbla"); } });
    			 */
     
    			try
    			{
    				Thread.sleep(1000);
    			} catch (InterruptedException e1)
    			{
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
    			//      ardoise.run();
    		}
    	}
     
    	private synchronized boolean isCompt()
    	{
    		return compt;
    	}
    }
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 80
    Points : 43
    Points
    43
    Par défaut
    Merci, beaucoup le chronomètre tourne!!

    Mais j'ai encore un petit souci, à chaque fois que j'appuie sur start il refait d'autre bouton au dessus le champ chronomètre aussi est dédoublé.

    J'essaye de comprendre pourquoi.
    Résultat en PJ
    Images attachées Images attachées  

  5. #5
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 80
    Points : 43
    Points
    43
    Par défaut
    Le problème est réglé c'est la surcharge paint() qui faisait défaut, donc j'ai utilisé un label avec settext() à la place et tout marche nikel confer PJ.

    Merci.
    Images attachées Images attachées  

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

Discussions similaires

  1. Lucene chronométrer une tâche en Java
    Par linoge669 dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 01/01/2015, 06h15
  2. Chronomètre en Java + bibliothèque Swing
    Par selma89 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 09/09/2011, 14h23
  3. [Stratégie] Un Chronomètre en Java ?
    Par Jerem6464 dans le forum Général Java
    Réponses: 2
    Dernier message: 09/10/2008, 00h24
  4. webcam : lire sur un port usb en c/c++ ou java. sous win. ?
    Par flo007 dans le forum Choisir un environnement de développement
    Réponses: 2
    Dernier message: 24/05/2002, 23h24
  5. Service de nommage java C++
    Par Anonymous dans le forum CORBA
    Réponses: 3
    Dernier message: 15/04/2002, 12h48

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