Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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_Animation_2d_Physics - Fatal编程技术网

关于重新构造图像的Java动画

关于重新构造图像的Java动画,java,animation,2d,physics,Java,Animation,2d,Physics,嗨,我目前正在制作一个程序,它将显示一个弹簧,它随着我输入的值移动,并使用物理公式。问题是,当我创建弹簧并启动动画时,旧图像将保留在那里并覆盖,而不删除该图像。下面是问题代码: bouton3.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { /*anime.animer(); anime.repai

嗨,我目前正在制作一个程序,它将显示一个弹簧,它随着我输入的值移动,并使用物理公式。问题是,当我创建弹簧并启动动画时,旧图像将保留在那里并覆盖,而不删除该图像。下面是问题代码:

bouton3.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            /*anime.animer();
              anime.repaint();*/

            for (int t = 0; t < 500; t += 5) {
                for (int i = 105; i < 175; i += 5) {
                    Ellipse2D elp1 = new Ellipse2D.Double(i, 100, 15, 30);
                    ((Graphics2D) dessinPanel.getGraphics()).draw(elp1);


                }
                for (int i = 105; i < 175; i += 5) {
                    Ellipse2D elp1 = new Ellipse2D.Double(i, 100, 15 + osi.simuler(t), 30);
                    ((Graphics2D) dessinPanel.getGraphics()).draw(elp1);
                    dessinPanel.repaint();

                    Rectangle2D rect = new Rectangle2D.Double(186 + osi.simuler(t), 90, 50, 50);
                    ((Graphics2D) dessinPanel.getGraphics()).draw(rect);
                    dessinPanel.repaint();
                }
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        }
    });
bouton3.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件){
/*动漫;
动画。重新绘制()*/
对于(int t=0;t<500;t+=5){
对于(int i=105;i<175;i+=5){
Ellipse2D elp1=新的Ellipse2D.Double(i,100,15,30);
((Graphics2D)dessinPanel.getGraphics()).draw(elp1);
}
对于(int i=105;i<175;i+=5){
Ellipse2D elp1=新的Ellipse2D.Double(i,100,15+osi.simuler(t),30);
((Graphics2D)dessinPanel.getGraphics()).draw(elp1);
dessinPanel.repaint();
矩形2D rect=新矩形2D.Double(186+osi.simuler(t),90,50,50);
((Graphics2D)dessinPanel.getGraphics()).draw(rect);
dessinPanel.repaint();
}
试一试{
睡眠(10);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}
});
这里还有一些图片可以说明这个问题:

您需要将绘画与价值调整分离

绘制操作应从清除背景开始,然后使用当前输入值绘制弹簧和长方体

当输入值更改时,只需更新变量并使显示区域无效()

为了获得更好的性能,还可以通过以背景色在弹簧和长方体的当前位置绘制弹簧和长方体来清除背景。这也使得更新输入值更加困难


您可能会使用的另一种技术是加宽画笔并首先以背景色绘制,然后收缩画笔并以正确的形式绘制实际的弹簧和矩形。这相当于擦除背景,只要您控制在单个帧中可以移动的量。

这不是绘制形状的方式。阅读此外,您不能在事件处理程序或绘制方法中休眠;您必须从的事件处理程序(而不是java.util.Timer!)调用repaint()。