开发者

How to implement actionlistener inside a Timer program?

I need this timer program to run indefinately, until someone presses the reset button. This timer program would increment or decrement with a single click of a button. For example, click once, and it will increment UNTIL someone says it to stop, or to decrement. Problem is, I think i've made the correct codes for this, but it simply wont run. There must be a logical error in it, can't seem to pinpoint where exactly, though. Can you tell whats wrong with my code?

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);
   }
}


This while (true) will put your whole application to sleep:

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

Simply don't do this in a Swing application, at least not on the main Swing event thread since it ties up the event thread, allowing no other actions to take place. Besides since you are using a Timer, there's absolutely no need for the while loop in the first place.

Edit 1
Other problems:

  • Your TimeClassAdd is the ActionListener used by the Timer. The getSource returned from ActionEvent object that is passed into its actionPerformed method will be the object whose event triggered the event, here the timer not a button. So you cannot retrieve which button was pressed from this ActionEvent object.
  • Instead you will need to retrieve that information from the getSource() returned by the ActionEvent object passed into the the "event" class's actionPerformed method.
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜