我在点击鼠标后启动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();
}
}
}
我想启动计时器以开始动画,但它无效。
点击按钮后如何启动计时器需要帮助。
感谢。
答案 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)
有些事情要尝试:
检查您的面板是否可见,例如使背景颜色变红。
检查动画是否正在更新。例如,如果您通过在paint()方法中绘制不同的帧来进行动画处理,那么在更新控制动画的变量之后,您需要在计时器中调用repaint()。或者,如果通过更改布局属性来完成动画(例如,移动组件),则需要调用validate()。
使用摇摆计时器可以让你入门,但它确实是裸露的基础。还有一些图书馆avaialbe可以让您更省力:
答案 2 :(得分:1)
我知道这个问题有点陈旧,但我认为你没有答案。
我认为问题在于ShowMe类及其Timer正在被垃圾收集,因此无法按照您的想法进行操作。
您正在创建一个新的本地ShowMe变量,该变量在actionPerformed方法完成后立即超出范围。 Timer及其ActionListener是ShowMe类实例的本地,因此当actionPerformed方法完成时,它们也可用于GC。
我不确定ShowMe课程在做什么。它似乎是一个JPanel,所以我认为它是你想要显示的东西。听起来像在你的Test类(或真正的类)中,拥有一个ShowMe数据成员可能会更好,你可以在单击按钮时调用它,而不是每次都创建一个新成员。
答案 3 :(得分:1)
您对Timer类的使用似乎是正确的。也许问题在于MoveListener。
您是否还记得使用paintImmediately()
方法重新制作动画?
如果仅使用repaint()
,则无法看到流畅的动画,因为对repaint()
的重复呼叫减少为一次呼叫。