2010-04-12 64 views
3

我在点击鼠标后启动javax.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(); 
    } 
} 
} 

我希望类启动计时器开始动画,但它不起作用。

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

谢谢。

+1

这是不是工作意味着什么。发生了什么,你有什么错误? – 2010-04-12 12:45:41

+0

感谢格式! – 2010-04-12 12:52:36

+2

你在哪里添加ShowMe面板到你的GUI?在您的示例代码中,您只需创建实例并启动计时器。或者排除的“动画”代码添加/检索需要显示的内容? – Ash 2010-04-12 13:06:48

回答

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 
    } 
    } 

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

+0

根据示例代码,'start()'在创建ShowMe面板的动作侦听器中被调用。 – Ash 2010-04-12 13:31:41

+0

@Ash - 谢谢,还没有看到它...我认为它不应该在那里......但改变了我的答案。 – 2010-04-12 14:57:17

1

有些事情尝试:

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

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

使用摆动计时器可以让你开始,但它确实是裸露的基础。还有一些库avaialbe,这将让你事半功倍走得更远:

  1. animated transitions
  2. Trident animation library
1

我知道这个问题是有点老了,但我不认为你有一个答案。

我相信问题是ShowMe类和它的Timer正在垃圾回收,因此不能做你认为应该做的事。

一旦actionPerformed方法完成,您正在创建一个新的本地ShowMe变量,该变量超出了范围。 Timer和它的ActionListener对于ShowMe类实例是本地的,所以当actionPerformed方法完成时,它们也可用于GC。

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

1

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

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

如果您仅使用repaint(),您将看不到平滑的动画,因为重复调用repaint()会减少为一个呼叫。