当绘制图像的mypanel类是一个线程的时候,调用repaint方法后会自动调用paint方法。importjava.awt.BorderLayout;importjava.awt.Graphics;importjava.awt.Image;importjavax.swing.Im...
当绘制图像的mypanel类是一个线程的时候,调用repaint方法后会自动调用paint方法。
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
class MyPanel extends JPanel implements Runnable
{
private Image img;
private int i =0 ;
private int j = 0;
public MyPanel()
{
img = new ImageIcon("1.jpg").getImage();
}
public void paintComponent(Graphics g)
{
g.drawImage(img,0,0,60,104,i*60,j*104,i*60+60,j*104+104,this);
}
public void run()
{
while(true)
{
while(j <= 3)
{
while(i <= 3)
{
try
{
Thread.sleep(333);
}
catch(Exception e)
{
}
repaint();
i++;
}
j++;
i=0;
}
i = 0;
j = 0;
}
}
}
public class test extends JFrame
{
private MyPanel p;
public test()
{
p = new MyPanel();
this.add(p,BorderLayout.CENTER);
this.setBounds(300,200,320,240);
this.setTitle("人物行走图");
new Thread(p).start();
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String args[])
{
new test();
}
}
当我修改程序为用一个线程去传递i和j给mypanel类,并调用repaint方法的时候,程序却会不调用paint方法,不知道问题出在哪?如下代码动画不会更新,
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
class MyPanel extends JPanel
{
private Image img;
private int i =0 ;
private int j = 0;
public MyPanel()
{
img = new ImageIcon("1.jpg").getImage();
}
public void paintComponent(Graphics g)
{
System.out.println("paint");
g.drawImage(img,0,0,60,104,i*60,j*104,i*60+60,j*104+104,this);
}
public void change(int i, int j){
this.i = i;
this.j = j;
repaint();
System.out.println("i = " + i + ", j = " + j);
}
}
class thread implements Runnable
{
private int i =0 ;
private int j = 0;
public void run()
{
MyPanel mp = new MyPanel();
while(true)
{
while(j <= 3)
{
while(i <= 3)
{
try
{
Thread.sleep(333);
}
catch(Exception e)
{
}
mp.change(i, j);
i++;
}
mp.change(i, j);
j++;
i=0;
}
mp.change(i, j);
i = 0;
j = 0;
}
}
}
public class test extends JFrame
{
private MyPanel p;
private thread t;
public test()
{
p = new MyPanel();
t = new thread();
this.add(p,BorderLayout.CENTER);
this.setBounds(300,200,320,240);
this.setTitle("人物行走图");
new Thread(t).start();
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String args[])
{
new test();
}
}
程序中用到的图片已经上传。
展开