Java 定时器不工作';我不想压倒一切

Java 定时器不工作';我不想压倒一切,java,timer,overriding,superclass,Java,Timer,Overriding,Superclass,我的一个朋友给了我这个计时器代码。我必须说我是一个初学者,所以我不明白@Override是什么,但是代码对其他朋友有用 tijd是值为10的整数 lx是标签的x值 s1也是一个值为3的整数 Eclipse提到了公共虚线: 此行有多个标记: 类型为new ActionListener(){}的方法actionPerformed(ActionEvent)必须重写超类方法 实现java.awt.event.ActionListener.actionPerformed 代码是: final T

我的一个朋友给了我这个计时器代码。我必须说我是一个初学者,所以我不明白@Override是什么,但是代码对其他朋友有用

  • tijd是值为10的整数
  • lx是标签的x值
  • s1也是一个值为3的整数
Eclipse提到了公共虚线:

此行有多个标记:

  • 类型为new ActionListener(){}的方法actionPerformed(ActionEvent)必须重写超类方法
  • 实现java.awt.event.ActionListener.actionPerformed
代码是:

 final Timer t = new Timer(tijd, new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent e) {
        lx = lx-s1;
    }
});
t.start();
随之而来的建议是删除
@Override
,但由于我不确定它的作用,我不知道我是否会删除代码中的重要内容。我想它不在那里,因为有人认为包含代码会很有趣

因此,我的问题是: 1.如何移动标签?
2.
@Override
有什么问题?

您在这里所做的是当场创建ActionListener接口的匿名实现,并将其直接作为计时器构造函数计时器(int x,ActionListener y)的第二个参数传递。 此接口的任何实现都必须提供ActionPerformed方法(ActionEvent e)的实现,因此您需要提供该方法。从Java6开始,接口方法的实现必须使用@Override标记进行注释。如果您使用的是Java5,那么它是可选的。 您可以使用命名(非匿名)类编写如下代码:

这将导致同样的行为。 但问题是:您在这里使用的是哪个计时器类?Java计时器类(Java.util.Timer)没有将ActionListener作为第二个参数的构造函数。 如果希望每隔这么多毫秒增量移动标签,则应创建一个执行此操作的TimerTask,然后创建一个计时器并使用该计时器计划TimerTask:

static class LabelMover implements TimerTask {
    @Override
    public void run() {
    // code to move the label
    }
}
Timer timer = new Timer();
timer.schedule(new TimerTask(), 0, tijd);

事实上,在这种情况下@Override可以忽略不计。然而,移动标签的代码非常重要。 您应该基于以下内容:

在计时器的动作侦听器中,执行如下操作:x=x-1; 然后标记。设置位置(x,y)


那就应该成功了

问题是什么?@realpoint如何移动标签,以及Override的问题是什么
@Override
告诉编译器您希望重写父类或接口中的方法(本例来自
ActionListener
),它提供了一种方法,编译器可以通过该方法告诉您何时犯了错误。确保您正在导入
java.awt.event.ActionListener
java.awt.event.ActionEvent
javax.swing.Timer
@MadProgrammer我已经导入了这3个。这是否意味着我可以删除@Override?关于移动标签:这不是一件小事,因为在Swing中,标签的位置通常由其容器决定。你应该发布所有相关代码,也许还有一个屏幕截图。一般来说,您需要访问其中一个GUI组件—只需更改变量不会影响GUI对象。至于
@Override
-Eclipse实际上是在给您一个错误还是仅仅是一个警告?OP似乎在使用,而不是
java.util.Timer
。这是真的。无论如何谢谢你,如果我的继续给你,也许我可以用这个errors@Canelaguila您最好坚持使用javax.swing.Timer,因为它确保在事件调度线程中完成修改,这在swing应用程序中很重要。这意味着op将违反swing的单线程规则,因此,不,他们不应该用你的例子嘿,别开枪!我明确询问使用了什么定时器类。由于缺乏这些信息,我不得不猜测并选择了一个我知道的计时器。我花时间解释了@Override问题,这就是问题所在。所以,给我点信任吧,是的!谢谢你,你是我的英雄:D
static class LabelMover implements TimerTask {
    @Override
    public void run() {
    // code to move the label
    }
}
Timer timer = new Timer();
timer.schedule(new TimerTask(), 0, tijd);