Java按钮中的计时器



我不知道如何添加此代码Insid Emy程序。就像e ..如果我单击按钮或通过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));
            }
        });

这是新程序员查找代码,然后将其复制并粘贴到他们认为可能有效的典型问题。正如您已经意识到的那样。。。并不是那么简单,否则您显然不会在这里寻求帮助。

您提供的代码有很多问题,这就是为什么我会为您提供代码以向您展示如何使用jbutton Action事件中的本地计时器来表明该代码如何工作,并指出一些特定的特定特定时间问题,以便您可以在稍后遇到这种事情的情况下意识到它们。

您无需声明您的计时器变量,然后稍后在道路上初始化。您可以在同一行上声明并初始化计时器变量,例如:

final Timer timer = new Timer(10, new ActionListener() {
    ..................
    ..................
    ..................
});

您的长数据类型 starttime 变量永远不会在本地计时器或任何内部(本地)类中起作用,因为需要进行价值更改。对于您的开始时间要在本地计时器类中使用的变量,它需要在此处携带完整的范围,并且要执行该变量需要将其声明为 final 。嗯,尽管如此,您无法更改最终变量中的值,这是该倒计时计时器正常运行的要求。如果我们不声明 starttime 变量为 final ,那么我们将最终以最终形式最终或有效的" 编译错误"。这样的解决方案是在本地计时器类中本身在本地计时器类中声明和初始化 starttime 变量:

final Timer timer = new Timer(10, new ActionListener() {
    long startTime = -1;
    @Override
    public void actionPerformed(ActionEvent event) {
        ..................
        ..................
    }
});

解决了这个小问题。现在您还有另一个问题,您不能仅在计时器的 action performed中使用timer.stop()方法来使用timer.stop()方法(即事件出于简单的原因,变量计时器没有适当的范围,也看不到它已被初始化。是的,它可能会编译,并且很可能会直到调用Timer.stop()方法,然后您最终会得到运行时异常("可变计时器可能没有被初始化了" )。不好,不要考虑捕捉例外,让过去是过去的,因为您最终不会阻止计时器(糟糕的练习)。您只需要在停下来时变得更奇特,这将解决问题:

((Timer)event.getSource()).stop();
//event is the ActionEvent variable (usually evt in some IDE's).

现在,您的持续时间变量,如果您想在时间安排1分钟的时间内提供长数值,则没有错。如果这是您的事,那么效果很好,但是对我个人而言,我喜欢简单地输入60而不是60000。最好提供几秒钟(IMHO),这当然需要使用附加变量,例如:

int seconds = 10;
final long duration = seconds * 1000;

现在,您只需要提供要设置倒数计时器的秒数。

您遇到的另一个问题是,您已经声明了一个名为标签代表Jlabel的变量。我以为您已经在GUI中安装了Jlabel(如果有GUI),在这种情况下,您需要在声明 label 变量时提供该jlabel变量名称,例如:

JLabel label = (JLabel)jLabel1;

以这种方式,标签变量表示您的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();
}

最新更新