我没有在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)
,但有没有办法让我在同一个类中使用两个定时器?
感谢任何帮助,谢谢你。
答案 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是死技术。不要太挂他们;你最好完全避免花时间在那些。