Javax Swing Timer帮助

时间:2010-04-12 12:44:52

标签: java swing timer

我在点击鼠标后启动javax.swing.Timer时遇到一些问题。我希望在用户点击按钮后启动计时器以执行某些动画,但它不起作用。

以下是代码段:

public class ShowMe extends JPanel{
  private javax.swing.Timer timer;

  public ShowMe(){
    timer = new javax.swing.Timer(20, new MoveListener());
  }    

  // getters and setters here

  private class MoveListener implements ActionListener {

    public void actionPerformed(ActionEvent e) {
     // some code here to perform the animation
    }
  }
}

这是包含按钮的类,以便当用户点击按钮时,计时器开始动画

public class Test{

 // button declarations go here and registering listeners also here

 public void actionPerformed(ActionEvent e) {
  if(e.getSource() == this.btnConnect){
      ShowMe vis = new ShowMe();
      vis.getTimer().start();
  }
 }
}

我想启动计时器以开始动画,但它无效。

点击按钮后如何启动计时器需要帮助。

感谢。

4 个答案:

答案 0 :(得分:1)

您必须调用计时器的start()方法才能启动它。

  public ShowMe(){
    timer = new javax.swing.Timer(20, new MoveListener());
    timer.start();
  }  

修改
我还没有看到在start()类中调用Test ...
下一步是添加一些日志/打印到MouseListener类以检查它是否被调用

  private class MoveListener implements ActionListener {

    public void actionPerformed(ActionEvent e) {
      System.out.println("MouseListener activated");  // TODO delete this line
     // some code here to perform the animation
    }
  }

如果它正在运行(我找不到任何原因,为什么不在发布的代码中),问题就像Ash上面写的: 您创建了一个分配给vis的新实例并启动了其Timer,但您尚未将该实例添加到任何可见容器中。
(也许您之前在代码中添加了另一个ShowMe实例...)

答案 1 :(得分:1)

有些事情要尝试:

  1. 检查您的面板是否可见,例如使背景颜色变红。

  2. 检查动画是否正在更新。例如,如果您通过在paint()方法中绘制不同的帧来进行动画处理,那么在更新控制动画的变量之后,您需要在计时器中调用repaint()。或者,如果通过更改布局属性来完成动画(例如,移动组件),则需要调用validate()。

  3. 使用摇摆计时器可以让你入门,但它确实是裸露的基础。还有一些图书馆avaialbe可以让您更省力:

    1. animated transitions
    2. Trident animation library

答案 2 :(得分:1)

我知道这个问题有点陈旧,但我认为你没有答案。

我认为问题在于ShowMe类及其Timer正在被垃圾收集,因此无法按照您的想法进行操作。

您正在创建一个新的本地ShowMe变量,该变量在actionPerformed方法完成后立即超出范围。 Timer及其ActionListener是ShowMe类实例的本地,因此当actionPerformed方法完成时,它们也可用于GC。

我不确定ShowMe课程在做什么。它似乎是一个JPanel,所以我认为它是你想要显示的东西。听起来像在你的Test类(或真正的类)中,拥有一个ShowMe数据成员可能会更好,你可以在单击按钮时调用它,而不是每次都创建一个新成员。

答案 3 :(得分:1)

您对Timer类的使用似乎是正确的。也许问题在于MoveListener。

您是否还记得使用paintImmediately()方法重新制作动画?

如果仅使用repaint(),则无法看到流畅的动画,因为对repaint()的重复呼叫减少为一次呼叫。