Java 定时器不工作';我不想压倒一切
我的一个朋友给了我这个计时器代码。我必须说我是一个初学者,所以我不明白@Override是什么,但是代码对其他朋友有用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
- tijd是值为10的整数
- lx是标签的x值
- s1也是一个值为3的整数
- 类型为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);