Partage
  • Partager sur Facebook
  • Partager sur Twitter

Affichage d'un timer

    22 février 2020 à 15:47:36

    Bonjour à tous j'aurais deux questions à vous poser. Je voudrais savoir pour quelle raison mon timer n'affiche pas l'année dans laquelle on se situe et aussi comment faire mettre différentes vitesse en fonction de différentes intervalles d'année.

    package chrono;
    
    
    
    public class Chronometer {
    	private static long debut = -1598000;
    	private static long fin = 2019;
    	private long annee;
    	public Chronometer() {
    		annee = debut;
    	}
    	public void init() {
    		annee = debut;
    	}
    	public void increment() {
    		while(annee<=fin) {
                annee++;
            }	
    	}
    	public long getAnnee() {
    		return annee;
    	}
    	
    	public String toString() {
    		String a="";
    		a+=getAnnee();
    		return a;
    	}
    }
    
    package chrono;
    
    import java.awt.BorderLayout;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Font;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    
    public class ChronometerGUI extends JFrame implements Runnable {
    	private static final Dimension IDEAL_MAIN_DIMENSION = new Dimension(800, 400);
    	private static final Dimension IDEAL_DASHBOARD_DIMENSION = new Dimension(800, 300);
    
    	private static Font font = new Font(Font.SERIF, Font.BOLD, 20);
    
    
    	private static final int Vitesse = 1000;
    
    	private static final long serialVersionUID = 1L;
    
    
    	private Chronometer chronometer = new Chronometer();
    
    	private JButton startButton = new JButton(" Start ");
    	private JButton clearButton = new JButton(" Clear ");
    
    	private JLabel anneeLabel = new JLabel("Annee:");
    
    
    	private JLabel anneeValue = new JLabel("");
    
    
    	private JPanel control = new JPanel();
    
    
    	private ChronometerGUI instance = this;
    
    
    	private boolean stop = true;
    
    	public ChronometerGUI(String title) {
    		super(title);
    		init();
    	}
    
    	private void init() {
    		updateValues();
    
    		Container contentPane = getContentPane();
    		contentPane.setLayout(new BorderLayout());
    
    		control.setLayout(new FlowLayout(FlowLayout.CENTER));
    		anneeLabel.setFont(font);
    		control.add(anneeLabel);
    		anneeValue.setFont(font);
    		control.add(anneeValue);
    
    
    
    		startButton.setFont(font);
    		startButton.addActionListener(new StartStopAction());
    		control.add(startButton);
    
    		clearButton.setFont(font);
    		clearButton.addActionListener(new ClearAction());
    		control.add(clearButton);
    
    		contentPane.add(BorderLayout.NORTH, control);
    
    
    
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		pack();
    		setVisible(true);
    		setPreferredSize(IDEAL_MAIN_DIMENSION);
    		setResizable(false);
    	}
    
    	private void updateValues() {
    		
    		long annee = chronometer.getAnnee();
    
    	}
    
    
    
    	@Override
    	public void run() {
    		while (!stop) {
    			try {
    				Thread.sleep(Vitesse);
    			} catch (InterruptedException e) {
    				System.out.println(e.getMessage());
    			}
    			chronometer.increment();
    			
    			// Ensure that the chronometer is not stopped during the iteration.
    			if (!stop) {
    				updateValues();
    			}
    		}
    	}
    
    	private class StartStopAction implements ActionListener {
    		@Override
    		public void actionPerformed(ActionEvent e) {
    			if (!stop) {
    				stop = true;
    				startButton.setText(" Start ");
    			} else {
    				stop = false;
    				startButton.setText(" Pause ");
    				Thread chronoThread = new Thread(instance);
    				chronoThread.start();
    			}
    		}
    	}
    
    	private class ClearAction implements ActionListener {
    
    		@Override
    		public void actionPerformed(ActionEvent e) {
    			stop = true;
    			startButton.setText(" Start ");
    			chronometer.init();
    			updateValues();
    		}
    
    	}
    
    	public static void main(String[] args) {
    		new ChronometerGUI("Chronometer");
    	}
    
    }

    Merci d'avance

    • Partager sur Facebook
    • Partager sur Twitter
      24 février 2020 à 11:22:22

      Il y a trois problèmes principaux, et un secondaire.

      1°) Ta méthode increment() passe en revue toutes les années sans faire aucune action sur chaque année, et se termine quand l'année vaut 2019.
      Donc quand la suite du code s'exécute, l'année vaut déjà 2019.

      2°) Ta méthode updateValues() n'a aucun effet. Elle crée une variable locale annee, qui n'existe que dans la méthode et est donc détruite après l'appel à la méthode. Cette variable n'est utilisée nulle part ailleurs.

      3°) Pour mettre à jour une interface Swing après un traitement en arrière-plan (ce qui est le cas ici avec ton Timer), il faut utiliser un thread spécifique qui s'appelle l'Event Dispatch Thread (EDT) avec la méthode SwingUtilities.invokeLater ou SwngUtilities.invokeAndWait.
      Sinon, soit ton interface plantera (peut-être pas tout de suite, mais un jour ou l'autre), soit elle ne se mettra pas à jour.

      4°) Ca ne sert à rien de créer une variable d'instance égale à "this". Utilise directement le mot-clé this là où tu en as besoin.

      • Partager sur Facebook
      • Partager sur Twitter

      Affichage d'un timer

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown