JAVA中在JPanel里调用Graphics实现循环产生动画的问题。

想要实现用JAVA绘制简单的动画效果,大致就是先建一个JFrame对象,在里面添加一个JPanel,然后在JPanel里面用Graphics来进行画图,重复进行绘制一个与背景相同颜色的一张图像,在绘制一张其他的图像,经过一段时间之后重复进行。效果就是在一个背景中图像像右方移动。
在Graphics里面添加for语句在JFrame里面可以实现的。但是放到了JPanel里面就不行了,只会显示循环结束之后的图像,希望能够知道这个是什么原因造成的,能够用什么方法解决,望高手指教。
代码如下:
package Jpg_2;

import javax.swing.*;
import java.awt.*;

public class jpg_2
{
public static void main(String[] args)
{
frame f=new frame();
}
}
class frame extends JFrame
{
CJPanel c;

frame()
{
    super("图片");
    setSize(500,500);
    c=new CJPanel();
    this.add(c);
    c.repaint();
    setVisible(true);
}
class CJPanel extends JPanel
{
    ImageIcon icon=new ImageIcon("f:/3.png");
    ImageIcon icon2=new ImageIcon("f:/4.png");
    Image image=icon.getImage();
    Image image2=icon2.getImage();

    public void paint(Graphics g)
    {
        g.drawImage(image,20,20,this);
        g.setColor(Color.red);
        g.fillRect(0,0,500,500);
        for (int i=20;i<180;i++)
        {
            g.drawImage(image2,i,20,this);
            g.drawImage(image,i+1,20,this);
            try
            {
                Thread.sleep(10);
            }
            catch(InterruptedException e){}
        }
    }
}

}

2个回答

你这思路有点不对,代码也很乱.做动画你不能在paint里这么玩.paint里自作绘图动作,绘制的条件另起一个线程去更新,大概给你改了自己看看思路

 import javax.swing.*;
import java.awt.*;

import static javax.swing.JFrame.EXIT_ON_CLOSE;

/**
 * Created by gxf on 17-5-22.
 */
public class jpg_2 {
    public static void main(String[] args) {
        frame f = new frame();
        f.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
}

class frame extends JFrame {
    CJPanel c;

    frame() {
        super("图片");
        setSize(500, 500);
        c = new CJPanel();
        this.add(c);
        c.repaint();
        setVisible(true);
        c.launchJPanel();
    }

    class CJPanel extends JPanel {
        ImageIcon icon = new ImageIcon("/home/gxf/图片/2.png");
        ImageIcon icon2 = new ImageIcon("/home/gxf/图片/1.png");
        Image image = icon.getImage();
        Image image2 = icon2.getImage();
        int x = 20, y = 20;

        public void launchJPanel() {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    while (true) {
                        repaint();
                        try {
                            Thread.sleep(10);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }).start();
        }
        public void paint(Graphics g) {
            g.setColor(Color.red);
            g.fillRect(0, 0, 500, 500);
            g.drawImage(image2, x, y, this);
            g.drawImage(image, x + 1, y, this);
            moveImage();
        }

        public void moveImage() {
            if (x < 180)
                x++;
            else
                x = 20;
        }
    }
}

Adiland
Adiland 随便说一句,我以前是自学GVBASIC制作SPRG的,对JAVA不是那么熟,所以对大部分术语完全不知道在说什么……在GVBASIC里面长时间的循环会导致内存不足跳错,虽然不清楚JAVA是否有这个问题,不过如果可能的话还是希望尽可能避免。
大约 3 年之前 回复
Adiland
Adiland 因为之前制作SPRG的时候一直是在JFrame里面使用graphics的,虽然在坐标上麻烦了一些,不过姑且是能玩的程度,不过,为了操作起来更便利一些,想要在JPanel里面实现相同的结果。
大约 3 年之前 回复
Adiland
Adiland new Thread(new Runnable()这个指令我用过,在制作需要键盘或鼠标不断操纵的游戏(如ACT,FPS)的时候很有效,不过在制作SPRG的时候大部分时间是用于思考的,使用这个语句会造成长时间的无意义循环,即占资源又没什么用。
大约 3 年之前 回复

在自己的线程里重绘,然后在paint里根据最新的坐标绘制

Adiland
Adiland 我对线程不是很懂……虽然知道定义但是不知道操作方法,这种Graphics的语句很多教材里面讲的也比较少。
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐