用java绘制动画的疑问,问题:调用repaint方法后,会自动调用paint方法?抱歉,没有积分了,但是还请帮忙

当绘制图像的mypanel类是一个线程的时候,调用repaint方法后会自动调用paint方法。importjava.awt.BorderLayout;importjav... 当绘制图像的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();
}
}
程序中用到的图片已经上传。
展开
 我来答
百度网友c2007c2
2012-01-04 · TA获得超过1641个赞
知道小有建树答主
回答量:89
采纳率:0%
帮助的人:80.4万
展开全部
线程处理机制问题分析:你用DEBUG跟踪代码运行会发现,main是主线程,它是在你当前配置目录下查找类,而别一个你自定义线程t它会通过start()在java内制包运行他的run()方法,而repaint()方法能跳出线程找到import java.awt.Graphics里的Graphics g画笔,却找不到非public类中的change方法所以无法运行!

解决方法:(以上分析我没做过测试只是理论推出来的结果)
1.把change()方法去调
2.把MyPanel 设为public(估计不行)
建议:最好把repaint()放到try{}语句块里,这样出什么错你能知道
追问
我的目的就是通过主方法去改变动画,去掉change方法后,如何修改动画的坐标呢?
追答
在RUN()方法中建一个类的对象,由对象去调用它自己的成员变量(如果是private你要提供get,set方法,如果不懂那就把成员变量改成public好了),试试看吧。这些问题都是权限问题,而且MyPanel这个类要求线程能访问得到(改为public理论上可以访问)
Ka__bU
2012-01-02
知道答主
回答量:3
采纳率:0%
帮助的人:3.1万
展开全部
repaint()方法是paint()方法的子方法,repaint()的使用规则是调用父类paint()的paint方法,因为如果你在一个程序中没有定义父类的paint()方法则repiant()调用的父类方法是个空的,也就相当于清空。但是如果你在一个程序中同时有paint()和repaint()那么就会清不了屏,解决办法是,你在paint()方法中的开头加上super.paint()
追问
上面的那段程序是可以运行的,下面的那段程序是用一个线程给另一个类传递数据,并调用了repaint方法,程序中没有同时复写repaint方法和paint方法。只是复写了paint方法,也按照你说的,在复写的paint方法里加上了super.paint(g);,但是一样是不行。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
1039873756
2012-01-04
知道答主
回答量:2
采纳率:0%
帮助的人:3359
展开全部
额,求给分
追问
你能帮我解决,给分是小问题。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式