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

本文探讨了在Java Swing中使用`repaint()`方法和`paintComponent()`方法创建动画的问题。当`MyPanel`类直接实现`Runnable`并在其内部循环中调用`repaint()`时,`paintComponent()`会被正确调用并更新图像。然而,当创建一个单独的线程来更新`i`和`j`并调用`repaint()`时,`paintComponent()`不再被调用。问题可能在于线程同步和组件的更新机制。
摘要由CSDN通过智能技术生成

当绘制图像的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();

}

}

程序中用到的图片已经上传。

展开

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值