Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用摆动计时器启动/停止动画_Java_Swing_Animation_Timer_Applet - Fatal编程技术网

Java 如何使用摆动计时器启动/停止动画

Java 如何使用摆动计时器启动/停止动画,java,swing,animation,timer,applet,Java,Swing,Animation,Timer,Applet,有人能教我如何使用摆动计时器达到以下目的吗: 我需要有一个多边形,当我单击鼠标时开始设置动画(简单的动画,如旋转);并在我再次单击时停止设置动画 我在理解MouseListener的工作方式方面没有问题,但在实际动画方面有问题。我尝试在paint()方法中使用while块模拟动画,在该方法中,我将绘制、擦除和重画多边形(例如模拟旋转),但在while中,小程序不会听到单击。它只会听一会儿。当我单击鼠标时,我需要swing计时器来中断while。小程序不会侦听单击,因为主线程(事件调度线程,EDT

有人能教我如何使用
摆动计时器
达到以下目的吗:

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


我在理解
MouseListener
的工作方式方面没有问题,但在实际动画方面有问题。我尝试在
paint()
方法中使用while块模拟动画,在该方法中,我将绘制、擦除和重画多边形(例如模拟旋转),但在while中,小程序不会听到单击。它只会听一会儿。当我单击鼠标时,我需要swing计时器来中断while。

小程序不会侦听单击,因为主线程(事件调度线程,EDT)在while循环中,不会侦听您的单击

你需要另一根线。 (尝试使用SwingWorker)

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

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

祝您好运

此控件使用按钮控制,而此相关控件则响应鼠标单击。后一个示例在每次单击时反转方向,但“开始/停止”是一个简单的更改

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();
    }
});
覆盖
绘制(图形g)
并从
操作执行(e)
修改的数据中绘制多边形

最后,启动/停止动画的按钮在其事件处理程序中具有以下代码

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

抱歉,如果我的问题看起来很愚蠢,那么你说的框架构造函数(是init()方法)是什么意思呢。我在哪里实现按钮(事件处理程序)。谢谢类的构造函数是一个与类同名的方法。例如,类
public MyFrame扩展了javax.swing.JFrame
public MyFrame(){…}
作为其构造函数。当我们使用
new
关键字创建对象时,将调用构造函数。例如,可以使用以下命令创建框架对象
MyFrame f=new MyFrame()好的,我理解,但我不知道在扩展Javaapplet的类中哪里有框架构造函数。我在init()方法中添加了新的计时器,但它似乎无法正常工作。小程序响应单击,但多边形数据似乎没有更改。如果使用小程序,可以将代码
timer=new timer…
放入
init()
方法中。不需要创建构造函数。顺便说一句,您是否覆盖了公共无效绘制(图形g)
来绘制多边形?我已将代码计时器=新计时器。。。在init()方法中。在绘制方法中,我有一些类似于如果鼠标点击的坐标在多边形上,那么{timer.start();drawPolygon;}。在paint()方法中放入timer.start()可以吗?