【问题标题】:how to use a swing timer to start/stop animation如何使用摇摆计时器开始/停止动画
【发布时间】:2011-12-26 15:26:58
【问题描述】:

有人可以教我如何使用swing timer 来达到以下目的:

当我单击鼠标时,我需要一个多边形开始动画(简单动画,如旋转);并在我再次单击时停止动画。

我理解MouseListener 的工作方式没有问题,但是对于实际的动画。我尝试在paint() 方法内使用while 块模拟动画,在该方法中我将绘制、擦除和重绘多边形(例如模拟旋转),但在while 内,小程序不会听到点击。它只会在一段时间后听。当我点击鼠标时,我需要摇摆计时器来打破这个时间。

【问题讨论】:

    标签: java swing animation timer applet


    【解决方案1】:
    import javax.swing.Timer;
    

    添加一个属性;

    Timer timer; 
    boolean b;   // for starting and stoping animation
    

    将以下代码添加到框架的构造函数中。

    timer = new Timer(100, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            // change polygon data
            // ...
    
            repaint();
        }
    });
    

    覆盖paint(Graphics g) 并根据actionPerformed(e) 修改的数据绘制多边形。

    最后,一个开始/停止动画的按钮在其事件处理程序中有以下代码。

    if (b) {
        timer.start();
    } else {
        timer.stop();
    }
    b = !b;
    

    【讨论】:

    • 对不起,如果我的问题看起来很愚蠢,但是框架的构造函数是什么意思(它是 init() 方法)。另外我在哪里实现按钮(事件处理程序)。谢谢
    • 类的构造函数是与类同名的方法。例如,public MyFrame extends javax.swing.JFrame 类将public MyFrame() { ... } 作为其构造函数。当我们使用new 关键字创建对象时,将调用构造函数。例如,可以使用此命令创建框架对象MyFrame f = new MyFrame();
    • 好的,我明白了,但是我看不到在扩展 java 小程序的类中哪里有框架构造函数。我将新计时器添加到 init() 方法中,但它似乎无法正常工作。小程序响应点击,但多边形数据似乎没有改变。
    • 如果你使用Applet,你可以把代码timer = new Timer...放在init()方法中。无需创建构造函数。顺便说一句,您是否覆盖了public void paint( Graphics g ) 来绘制多边形?
    • 我已将代码 timer = new Timer... 放入 init() 方法中。在绘画方法中,如果鼠标点击的坐标在多边形上,那么我有类似的东西{ timer.start();绘制多边形;}。如果我将 timer.start() 放在paint() 方法中可以吗?
    【解决方案2】:

    example 使用按钮控制javax.swing.Timer,而此相关example 响应鼠标单击。后一个示例会在每次点击时反转方向,但 start/stop 是一个简单的改变。

    【讨论】:

      【解决方案3】:

      小程序不会监听点击,因为主线程(事件调度线程,EDT)在 while 循环中并且没有监听您的点击。

      您需要另一个线程。 (尝试使用 SwingWorker http://download.oracle.com/javase/tutorial/uiswing/concurrency/worker.html

      因此,SwingWorker 将在后台执行 while 循环,发布结果以使您的多边形移动。

      然后 EDT 可以专注于任何事件(如点击)。如果你想停止它,你可以使用点击事件来杀死 SwingWorker。

      祝你好运

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-19
        相关资源
        最近更新 更多