如何在2个定时器之间互换?在Java GUI中

时间:2011-08-07 07:19:02

标签: java swing timer return

好的,基本上我正在尝试创建一个向上和向下计数的计时器。我需要程序在任何时候只激活一个计时器。有两个定时器,一个导致变量递增,另一个导致递减。我似乎无法做到正确,当我按下增量时,变量增加但从不停止,即使我按下减量按钮。我该怎么做呢?另外,另一个快速问题:如何返回按键方法中的值? Keypress默认是空的,所以我难倒。

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

    public class event implements ActionListener {

        public void actionPerformed(ActionEvent e) {

            if (e.getSource() == buttonAdd) {

                TimeClassAdd tcAdd = new TimeClassAdd();
                timer = new Timer(1000, tcAdd);
                timer.start();

            } else if (e.getSource() == buttonMin) {
                TimeClassMin tcMin = new TimeClassMin();
                timer2 = new Timer(1000, tcMin);
                timer2.start();


            } else if (e.getSource() == buttonReset) {
                timer.stop();
                timer2.stop();
                // This code does not work
                // Need to revert counter to 0.
            }
        }
    }

    public class TimeClassAdd implements ActionListener {

        int counter = 0;

        public void actionPerformed(ActionEvent f) {

            String status_symbol[] = new String[4];
            status_symbol[0] = "Unused";
            status_symbol[1] = "Green";
            status_symbol[2] = "Yellow";
            status_symbol[3] = "Red";

            if (counter < 3) {
                counter++;
                timerLabel.setText("Time left: " + status_symbol[counter]);
            } else {
                timerLabel.setText("Time left: " + status_symbol[counter]);
            }
        }
    }

    public class TimeClassMin implements ActionListener {

        int counter = 4;

        public void actionPerformed(ActionEvent d) {
            String status_symbol[] = new String[4];
            status_symbol[0] = "Unused";
            status_symbol[1] = "Green";
            status_symbol[2] = "Yellow";
            status_symbol[3] = "Red";

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

2 个答案:

答案 0 :(得分:3)

如果你启动第二个计时器,你肯定必须停止第一个计时器,如果它仍在运行(即在timer2.stop()之前调用timer.start(),反过来)。

否则两者都会干扰,即它们访问相同的字段(在这种情况下是timerLabel)。根据时间,如果第二个计时器持续增加该值,则可能会出现这种情况。如果是增量计时器总是在减速计时器后不久触发,输出值始终为3 - Red。计数器本身没有增加,但标签反复填充此值,因此看起来它完全忽略了递减计时器。

然而,如果计数器的计数器已达到最终值,您也应该停止每个计时器。没有必要再让它运行了。

关于你的第二个问题:你不能指定一个返回值,而是修改你的侦听器的某个字段,然后你可以在action方法之外访问它。

答案 1 :(得分:3)

另一个问题:如果您没有向其添加actionListener,则您的重置按钮(或任何按钮)将不会执行任何操作。换句话说,您需要具有看起来像......的代码。

buttonReset.addActionListener(...);

程序代码中的某个位置,按钮可以正常工作。