在java中使用swing计时器

时间:2016-09-20 00:47:22

标签: java swing timer

我没有在java中编写很长时间,最多只能编写一个月,但我已经编写了多种其他面向对象的语言。

我正在尝试使用java.swing.timer中包含的swing计时器,我读了https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html来尝试理解它。

我理解,对于timer = new Timer(speed, this),速度是计时器触发的频率,但我不明白this的含义。另外,我知道每次定时器触发时都会执行public void actionPerformed(ActionEvent e),但有没有办法让我在同一个类中使用两个定时器?

感谢任何帮助,谢谢你。

2 个答案:

答案 0 :(得分:4)

您正在调用的构造函数具有以下签名:

public Timer(int delay, ActionListener listener)

这意味着,在示例中,this指的是ActionListener接口的实例。

在您的示例中,包含计时器代码的类恰好实现ActionListener。这只是为了方便一个简洁的例子。

您可以将ActionListener的任何实例传递给您的计时器。如果您使用的是Java 8,那么使用method references非常简单。

public class TheExample
{
  public TheExample()
  {
    final Timer timerOne = new Timer(speedOne, this::timerOneMethod);
    final Timer timerTwo = new Timer(speedTwo, this::timerTwoMethod);
  }

  private void timerOneMethod(ActionEvent e)
  {
    // do something exciting
  }

  private void timerTwoMethod(ActionEvent e)
  {
    // do something else exciting
  }
}

如果您不使用Java 8,可以使用anonymous inner classes实现相同的目标。您可以找到example of this way here

答案 1 :(得分:2)

Timer的javadoc告诉你构造函数是什么about - 它需要一个int和一个 ActionListener 的实例。

因此,为了回答您的第一个问题,在Oracle的示例代码中,timer = new Timer(speed, this)发生在构成示例UI的Applet的 init 方法中。因此: this 引用“当前”对象(有关详细信息,请参阅here),即整个方法“属于”的Applet对象。

这只会起作用,因为示例类TumleItem被声明为 TumbleItem extends JApplet implements ActionListener

记录:了解这个的内容绝对是基本的东西。如果您不知道这个是什么,那么您不应该参与UI编码。在尝试运行之前学习抓取。

对于你的第二个问题:对于你想要使用的每个Timer实例,你需要一个可以传入的ActionListener。老式的做法是使用匿名内部类,比如

timer = new Timer(someSpeed, new ActionListiner() {
   @Override
   public void actionPerformed(ActionEvent evt) {
      System.out.println("Whatever");
   }
}

最后:Oracle的一个例子是使用Applets,简单地说:Applet是死技术。不要太挂他们;你最好完全避免花时间在那些。