Как реализовать actionlistener внутри программы Timer? - PullRequest
1 голос
/ 13 августа 2011

Мне нужно, чтобы эта программа таймера работала бесконечно, пока кто-нибудь не нажмет кнопку сброса. Эта программа таймера будет увеличиваться или уменьшаться одним нажатием кнопки. Например, нажмите один раз, и он будет увеличиваться, пока кто-то не скажет, чтобы он остановился или уменьшился. Проблема в том, что я сделал правильные коды для этого, но он просто не запустится. В этом должна быть логическая ошибка, хотя не могу точно определить, где именно. Можете ли вы сказать, что не так с моим кодом?

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

public class TimerTutorial extends JFrame {
   JLabel timerLabel;
   JButton buttonAdd, buttonMin, buttonReset;
   Timer timer;
   Timer timer2;

   public TimerTutorial() {
      setLayout(new GridLayout(2, 2, 5, 5));
      buttonReset = new JButton("Press to reset");
      add(buttonReset);

      buttonAdd = new JButton("Press to Add");
      add(buttonAdd);

      buttonMin = new JButton("Press to Minus");
      add(buttonMin);

      timerLabel = new JLabel("Waiting...");
      add(timerLabel);

      event e = new event();
      buttonAdd.addActionListener(e);
      buttonMin.addActionListener(e);
      buttonReset.addActionListener(e);
   }

   public class event implements ActionListener {
      public void actionPerformed(ActionEvent e) {
         while (true) {
            TimeClassAdd tcAdd = new TimeClassAdd();
            timer = new Timer(1000, tcAdd);
            timer.start();
            timerLabel.setText("IT HAS BEGUN");
         }
      }

      public class TimeClassAdd implements ActionListener {
         int counter = 0;

         public void actionPerformed(ActionEvent e) {
            String status_symbol[] = new String[4];
            status_symbol[0] = "Unused";
            status_symbol[1] = "Green";
            status_symbol[2] = "Yellow";
            status_symbol[3] = "Red";
            if (e.getSource() == buttonAdd) {
               if (counter < 3) {
                  counter++;
                  timerLabel.setText("Time left: " + status_symbol[counter]);
               } else {
                  timerLabel.setText("Time left: " + status_symbol[counter]);
               }
            } else if (e.getSource() == buttonMin) {
               if (counter >= 3) {
                  counter = 3;
                  timerLabel.setText("Time left: " + status_symbol[counter]);
                  counter--;
               } else if (counter == 2) {
                  timerLabel.setText("Time left: " + status_symbol[counter]);
                  counter--;
               } else if (counter == 1) {
                  timerLabel.setText("Time left: " + status_symbol[counter]);
               }
            }
         }
      }
   }

   public static void main(String args[]) {
      TimerTutorial gui = new TimerTutorial();
      gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      gui.setSize(500, 250);
      gui.setTitle("Timer Tutorial");
      gui.setVisible(true);
   }
}

1 Ответ

2 голосов
/ 13 августа 2011

Это while (true) переведет все ваше приложение в спящий режим:

     while (true) {
        TimeClassAdd tcAdd = new TimeClassAdd();
        timer = new Timer(1000, tcAdd);
        timer.start();
        timerLabel.setText("IT HAS BEGUN");
     }

Просто не делайте этого в приложении Swing, по крайней мере, не в главном потоке событий Swing, поскольку он связывает поток событий, не позволяя выполнять никакие другие действия. Кроме того, так как вы используете таймер, вам вообще не нужен цикл while.

Редактировать 1
Другие проблемы:

  • Ваш TimeClassAdd - это ActionListener, используемый Timer. GetSource, возвращаемый из объекта ActionEvent, который передается в его метод actionPerformed, будет объектом, событие которого вызвало событие, здесь таймер, а не кнопка. Таким образом, вы не можете получить, какая кнопка была нажата из этого объекта ActionEvent.
  • Вместо этого вам нужно будет извлечь эту информацию из getSource (), возвращенного объектом ActionEvent, переданным в метод actionPerformed класса "событие".
...