【问题标题】:Timer doesn't feel like overriding计时器感觉不像覆盖
【发布时间】:2015-03-09 06:06:53
【问题描述】:

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

  • tijd 是一个 int,值为 10
  • lx 是标签的 x 值
  • s1 也是一个值为 3 的 int

Eclipse 谈到了公共 void 行:

这一行有多个标记:

  • 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有什么问题?

【问题讨论】:

  • 问题是什么?
  • @RealSkeptic 如何移动标签,以及 Override 有什么问题
  • @Override 告诉编译器您希望重写父类或接口中的方法(本例来自ActionListener),它提供了一种方法,当您犯了一个错误。确保您正在导入 java.awt.event.ActionListenerjava.awt.event.ActionEventjavax.swing.Timer
  • @MadProgrammer 我已经导入了这 3 个。这是否意味着我可以删除 @Override?​​span>
  • 关于移动标签:这并非完全无关紧要,因为在 Swing 中,标签的位置通常由其容器决定。您应该发布所有相关代码,也许还有屏幕截图。一般来说,您需要访问其中一个 GUI 组件 - 仅更改变量不会影响 GUI 对象。至于@Override - Eclipse 实际上是给你一个错误还是只是一个警告?

标签: java timer overriding superclass


【解决方案1】:

好吧,在这种情况下,@Override 确实可以忽略不计。然而,移动标签的代码非常重要。 你应该以此为基础:

在计时器的动作监听器中执行如下操作:x = x - 1; 然后是 Label.setLocation(x,y);

这应该可以解决问题!

【讨论】:

  • 它做到了!谢谢你,你是我的英雄:D
【解决方案2】:

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

static class LabelMover implements ActionListener {
  @Override
  public void actionPerformed(ActionEvent e) {
  ...
  }
}

Timer timer = new Timer (tijd, new LabelMover());

这将导致相同的行为。 然而,问题是:您在这里使用的是哪个 Timer 类? Java Timer 类 (java.util.Timer) 没有将 ActionListener 作为第二个参数的构造函数。 如果您想让标签每隔这么多毫秒增量移动一次,那么您应该创建一个 TimerTask 来执行此操作,然后创建一个 Timer 并使用该计时器安排 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);

【讨论】:

  • OP 似乎使用的是javax.swing.Timer,而不是java.util.Timer
  • 确实如此。无论如何,谢谢你,如果我的继续出错,也许我可以使用这个
  • @Canelaguila 你最好坚持使用 javax.swing.Timer,因为它可以确保在事件调度线程中完成修改,这在 Swing 应用程序中很重要。
  • 这意味着操作将违反 Swing 的单线程规则,所以,不,他们不应该使用您的示例
  • 喂,别开枪!我明确询问使用了什么 Timer 类。由于缺乏这些信息,我不得不猜测并选择了一个我知道的计时器。我花时间解释了@Override 问题,这就是问题所在。所以给我一些信任。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多