好的,基本上我正在尝试创建一个向上和向下计数的计时器。我需要程序在任何时候只激活一个计时器。有两个定时器,一个导致变量递增,另一个导致递减。我似乎无法做到正确,当我按下增量时,变量增加但从不停止,即使我按下减量按钮。我该怎么做呢?另外,另一个快速问题:如何返回按键方法中的值? 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);
}
}
答案 0 :(得分:3)
如果你启动第二个计时器,你肯定必须停止第一个计时器,如果它仍在运行(即在timer2.stop()
之前调用timer.start()
,反过来)。
否则两者都会干扰,即它们访问相同的字段(在这种情况下是timerLabel
)。根据时间,如果第二个计时器持续增加该值,则可能会出现这种情况。如果是增量计时器总是在减速计时器后不久触发,输出值始终为3 - Red
。计数器本身没有增加,但标签反复填充此值,因此看起来它完全忽略了递减计时器。
然而,如果计数器的计数器已达到最终值,您也应该停止每个计时器。没有必要再让它运行了。
关于你的第二个问题:你不能指定一个返回值,而是修改你的侦听器的某个字段,然后你可以在action方法之外访问它。
答案 1 :(得分:3)
另一个问题:如果您没有向其添加actionListener,则您的重置按钮(或任何按钮)将不会执行任何操作。换句话说,您需要具有看起来像......的代码。
buttonReset.addActionListener(...);
程序代码中的某个位置,按钮可以正常工作。