想要实现用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){}
}
}
}
}
你这思路有点不对,代码也很乱.做动画你不能在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;
}
}
}
在自己的线程里重绘,然后在paint里根据最新的坐标绘制