我不知道如何将这段代码放入emy程序中。 Likee ..如果我点击JPanel中的按钮或鼠标(在原始面板内),程序将运行
static class Action implements ActionListener(){
public void actionPerformed (ActionEvent e){
long serialVersionUID = 1L;
Timer timer;
long startTime = -1;
long duration = 1200000 ;
JLabel label = new JLabel;
timer = new Timer(10, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (startTime < 0) {
startTime = System.currentTimeMillis();
}
long now = System.currentTimeMillis();
long clockTime = now - startTime;
if (clockTime >= duration) {
clockTime = duration;
timer.stop();
}
SimpleDateFormat df = new SimpleDateFormat("mm:ss:SSS");
label.setText(df.format(duration - clockTime));
}
});
答案 0 :(得分:0)
这是新程序员找到代码然后将其复制并粘贴在他们认为可行的任何地方的典型问题。正如你已经意识到的那样......并不是那么简单,否则你显然不会在这里寻求帮助。
您提供的代码存在许多问题,这就是为什么我会向您提供代码,向您展示如何使用JButton Action事件中的本地计时器,并指出一些特定的如果你再遇到这种事情,你可以在以后实现这些问题。
您无需声明计时器变量,然后稍后将其初始化。您可以在同一行上声明并初始化计时器变量,例如:
final Timer timer = new Timer(10, new ActionListener() {
..................
..................
..................
});
您的长数据类型 startTime 变量永远不会在本地计时器或任何内部(本地)类中工作,因为需要进行值更改。对于要在Local Timer Class中使用的 startTime 变量,它需要在那里携带全范围,为此,变量需要声明为 final 。嗯,这有一个问题,你不能改变最终变量中的值,这是这个倒数计时器正常运行的要求。如果我们不将 startTime 变量声明为 final ,那么我们最终会得到一个 “从内部类引用的局部变量必须是最终或有效的最终“ 编译错误。对此的解决方案是在Local Timer类中声明并初始化 startTime 变量,如下所示:
final Timer timer = new Timer(10, new ActionListener() {
long startTime = -1;
@Override
public void actionPerformed(ActionEvent event) {
..................
..................
}
});
解决了这个小问题。现在你还有另外一个问题,你不能只使用Timer.stop()方法在你自己内部停止你的Timer(就像:timer.stop();)在Timer的 actionPerformed中事件,原因很简单,变量计时器在那里没有适当的范围,也看不到它已被初始化。是的,它可能会编译并且它很可能会一直运行直到调用timer.stop()方法,然后你最终会得到一个运行时异常( “变量计时器可能没有已初始化“ )。不好,并且不考虑捕捉异常,并让过去的人过去,因为你最终没有停止计时器(糟糕的做法)。你只需要在停止时获得一点爱好者,这就可以解决问题:
((Timer)event.getSource()).stop();
//event is the ActionEvent variable (usually evt in some IDE's).
现在,您的持续时间变量,如果您想为1分钟的时间提供长数值,则没有任何问题。如果这是你的东西,那么效果很好,但就我个人而言,我喜欢简单地输入60而不是60000.如果值被硬编码到位但是它实际上是一个提供的值(无论从哪里),那么无关紧要提供秒数(恕我直言)更好,这当然需要使用额外的变量,例如:
int seconds = 10;
final long duration = seconds * 1000;
现在您只需要提供您想要将倒数计时器设置为的秒数。
你遇到的另一个问题是你已经声明了一个名为 label 的变量来表示一个JLabel,但是你无处可以将该变量引用到某个实际的JLabel或者将它添加到一个框架或面板组件中。我认为您已经在GUI中安装了JLabel(如果您有GUI),在这种情况下,当您声明标签变量时,您将需要提供该JLabel变量名称,如下所示: / p>
JLabel label = (JLabel)jLabel1;
这样,label变量代表GUI中名为 jLabel1 的JLabel。
最后(这是一个巨大的)你的计时器根本不会运行,如果你不告诉它这样做。你在哪里这样做,好吧,就在你的本地计时器课程当然:)这样:
final Timer timer = new Timer(10, new ActionListener() {
long startTime = -1;
@Override
public void actionPerformed(ActionEvent event) {
..................
..................
}
});
timer.start();
无论如何,这是承诺的完整代码:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
int seconds = 10; // supply timer duration in seconds
final long duration = seconds * 1000; // calculate to milliseconds
JLabel label = (JLabel)jLabel1; //whichever JLabel is in GUI
final Timer timer = new Timer(10, new ActionListener() {
long startTime = -1;
@Override
public void actionPerformed(ActionEvent event) {
if (startTime < 0) {
startTime = System.currentTimeMillis();
}
long now = System.currentTimeMillis();
long clockTime = now - startTime;
if (clockTime >= duration) {
clockTime = duration;
((Timer)event.getSource()).stop(); // stop the Timer
label.setText("Time Is UP"); // remove if you want or maybe just ""
return;
}
SimpleDateFormat df = new SimpleDateFormat("mm:ss:SSS");
label.setText(df.format(duration - clockTime));
}
});
timer.start();
}