【问题标题】:Using a swing timer in java在java中使用swing timer
【发布时间】:2017-01-27 18:54:57
【问题描述】:

我已经很久没有用 java 编码了,最多一个月,但我已经用多种其他面向对象的语言进行了编码。

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

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

感谢您的帮助,提前感谢您。

【问题讨论】:

    标签: java swing timer


    【解决方案1】:

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

    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!
    • “this::timerOne”存在错误。错误显示“令牌语法错误,删除这些令牌”。你知道如何解决这个问题吗?
    • @SAT:上面的代码对 Java 8 有效——你使用的是 Java 8 吗? (还要检查您的 IDE 是否配置为 Java 8 的语言级别)。
    • 谢谢,我的 IDE 没有使用 java 8,但我编译它并通过终端运行它,它工作正常。此外,在我的 Java 教科书中,有一个示例,在 main 中,'className inst = new className();'被声明,并且定时器被声明为'Timer clock = new Timer (speed, inst);'。我的问题是,我可以用'Timer clock = new Timer (speed, inst.func());'来做这样的事情吗?每次计时器触发时都会执行 func() 吗?
    • @SAT 你只需要满足可见性规则 - 正如上面编写的代码,方法是 private 所以不能在类外部引用。如果他们是公开的,他们可以。 (至于这是否是好的OO设计,那是另一回事了……)
    【解决方案2】:

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

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

    这只是因为示例类 TumleItem 被声明为 TumbleItem extends JApplet implements ActionListener

    郑重声明:了解 this 是关于什么的绝对是基本的东西。如果您不知道 this 是关于什么的,那么您不应该从事 UI 编码。在尝试跑步之前学习爬行。

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

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

    最后:Oracle 的一个例子是使用小程序,简单地说:小程序是死技术。不要太挂在他们身上;你最好避免完全花时间在这些上面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-23
      • 2012-02-11
      • 1970-01-01
      相关资源
      最近更新 更多