2013-09-18 1 views
0

Прежде всего привет! Это мой первый пост в stackoverflow! Это моя вторая попытка программирования чего-то на Java и первая попытка с gui.javax.swing.timer вычитает столько, сколько я нажимаю на кнопку запуска

У меня на самом деле две проблемы. Первая из них - программа, а вторая - часть кода.

Как программа должна работать:

При нажатии старт он отсчитывает с 01:00 до 00:00 каждую минуту (01:00 -> 00:59 -> 00:58). Когда вы нажимаете стоп, он перестает считать вниз (duh), и когда вы снова нажмете старт, он начинается с 01:00, как в первый раз.

Задача программы:

С учетом сказанного. Это работает только при первом нажатии. Когда я нажимаю старт несколько раз, он вычитает это количество раз из часов. Нажимается 2 раза (01:00 -> 00:58 -> 00:56). Нажимали 4 раза (01:00 -> 00:56 -> 00:52). и т. д. Это явно не должно происходить.

Понимание проблемы:

Я с трудом понять, почему таймер требует ActionListener и почему это работает, когда вы используете «нулевой». В некоторых случаях он также работает при использовании «этого» (чего я также не понимаю).

Java Swing Timer Documentation

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class CountdownClock extends JFrame 
{ 

    private int oneSecond = 1000; //Milliseconds 
    private Timer timer = new Timer(oneSecond * 60, null); 
    private int timerCount = 59; 

    public static void main(String args[]) 
    { 
     new CountdownClock(); 
    } 

    CountdownClock() 
    { 
     this.getContentPane().setLayout(null); 
     this.setBounds(800, 450, 300, 125); 

     final JLabel countdownLabel = new JLabel("01:00"); 
     countdownLabel.setBounds(110, 10, 125, 30); 
     countdownLabel.setFont(new Font("Serif", Font.PLAIN, 30)); 

     JButton startButton = new JButton("Start"); 
     startButton.setBounds(10, 50, 125, 30); 
     startButton.addActionListener(new ActionListener() 
     { 
     public void actionPerformed(ActionEvent e) 
     { 
      timer.setRepeats(true); 
      timer.stop(); 
      countdownLabel.setText("01:00"); 
      timerCount = 59; 
      timer.start(); 
      timer.addActionListener(new ActionListener() 
      { 
       public void actionPerformed(ActionEvent evt) 
       {  
        if (timerCount == 0) 
        { 
         timer.stop(); 
         countdownLabel.setText("00:00"); 
         timerCount = 59; 
        } 
        else if (timerCount <= 9) 
        { 
         countdownLabel.setText("00:0" + String.valueOf(timerCount)); 
         timerCount = timerCount - 1; 
        } 
        else 
        { 
         countdownLabel.setText("00:" + String.valueOf(timerCount)); 
         timerCount = timerCount - 1; 
        } 
       } 
      }); 
     } 
    }); 

    JButton stopButton = new JButton("Stop"); 
    stopButton.setBounds(150, 50, 125, 30); 
    stopButton.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      timer.stop(); 
      countdownLabel.setText("01:00"); 
      timerCount = 59; 
     } 
    }); 

    add(countdownLabel); 
    add(startButton); 
    add(stopButton); 

    setVisible(true); 
    } 
} 

ответ

3

Это происходит потому, что вы добавляете ActionListener к Timer каждый раз при нажатии кнопки. Так, поскольку Timer позволяет нескольким слушателям, каждый из них получает уведомление, когда таймер тикает.

Чтобы решить проблемы, вы можете просто создать новый Timer каждый раз, когда вы нажимаете кнопку запуска (timer = new Timer()). Или добавьте ActionListener только один раз в свой конструктор JFrame. Или даже удалить слушателя (но вы должны сохранить ссылку на него где-нибудь).

+0

Редактировать: Спасибо! Я понимаю, почему он это делает сейчас! У меня было прозрение, когда я читал ваш ответ так же, как в пятый раз, и теперь я вижу, насколько глупой и простой была моя проблема. Должен был подумать об этом давно с помощью «Добавить» в AddActionListener! – BinaryCode64

+0

+1, @ BinaryCode64, вы должны «принять» этот ответ, если он помог решить вашу проблему. – camickr

+0

Готово. Я думаю... – BinaryCode64

 Смежные вопросы

  • Нет связанных вопросов^_^