在JPanel上画图时为何paint()方法会被多次调用?

tripofdream 2003-09-15 11:17:44
代码如下:

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.*;

public class InfoPanel extends JPanel
{
private Image img = Toolkit.getDefaultToolkit().getImage(
InfoPanel.class.getResource("about.jpg"));
private int count = 0;

public InfoPanel()
{

}

public void paint(Graphics g){
super.paint(g);
g.drawImage(img,0,0,this.getWidth(),this.getHeight(),this);
count ++;
System.out.println(count);
}

public static void main(String[] args){
JFrame f = new JFrame();
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
f.setSize(400,200);
InfoPanel info = new InfoPanel();
f.getContentPane().add(info);
f.setVisible(true);
}
}

运行结果:
1
2
3
4
......
301
302
说明paint方法被多次调用,为什么?这样图片需要很长时间才能显示,怎样让图片立即显示?
...全文
529 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
LingFengNB 2003-09-16
  • 打赏
  • 举报
回复
good
tripofdream 2003-09-15
  • 打赏
  • 举报
回复
再加100,重赏之下必有勇夫?!
LingFengNB 2003-09-15
  • 打赏
  • 举报
回复
up
tripofdream 2003-09-15
  • 打赏
  • 举报
回复
图片为400*300*24
veijerd 2003-09-15
  • 打赏
  • 举报
回复
Awt被设计为假定图象可能是从缓慢的网络连接上得来的。java创建了一个新的线程来加载该文件,然后在文件实际加载完之前便返回。
在你的paint()中,因为图片尚未加载,所以paint一次次地尝试调用绘制图片,count的增加值由加载的速度决定。

可以采用MediaTracker来完成,这是它的典型应用
你的改正代码如下,我调试过了,你看看 :)

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.MediaTracker;
import javax.swing.*;

public class InfoPanel extends JPanel
{
private Image img = Toolkit.getDefaultToolkit().getImage(
InfoPanel.class.getResource("DDG51.gif"));


private int count = 0;

public InfoPanel()
{
MediaTracker tracker=new MediaTracker(this);
tracker.addImage(img,0);
try
{
tracker.waitForID(0);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}

public void paint(Graphics g){
super.paint(g);
g.drawImage(img,0,0,this.getWidth(),this.getHeight(),this);
count ++;
System.out.println(count);
}

public static void main(String[] args){
JFrame f = new JFrame();
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
f.setSize(400,200);
InfoPanel info = new InfoPanel();
f.getContentPane().add(info);
f.setVisible(true);
}
}

tripofdream 2003-09-15
  • 打赏
  • 举报
回复
T
tripofdream 2003-09-15
  • 打赏
  • 举报
回复
没有人能解释清楚吗?
whyxx 2003-09-15
  • 打赏
  • 举报
回复
我在我的机子上测试过了,只打到15就可以了,但估计不停的paint像是一个缓冲一样,在图片很大,没法一次画出来的时候,隔几秒就自动执行一下paint,直到图片出来为止
tripofdream 2003-09-15
  • 打赏
  • 举报
回复
Applet的例子就请不要拿过了,我要的是Frame下的。运行环境是win2000+jdk1.3.1
wangyanqiu 2003-09-15
  • 打赏
  • 举报
回复


up
cbhyk 2003-09-15
  • 打赏
  • 举报
回复
通过实现PanelUI在JPanel上绘图:

import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ImgPanel extends JPanel
{
private Image img;

public ImgPanel()
{
}

public void updateUI()
{
setUI(ImgPanelUI.getInstance());
}

public Image getImg()
{
return img;
}

public void setImg(Image image)
{
img = image;
}

public static void main(String[] args)
{
try
{
JFrame frame = new JFrame("test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Image img = Toolkit.getDefaultToolkit().getImage(ImgPanel.class.getResource("test.jpg"));
ImgPanel panel = new ImgPanel();

MediaTracker tracker = new MediaTracker(panel);
tracker.addImage(img, 1);
tracker.waitForID(1);
System.out.println("load image ok");

panel.setImg(img);

panel.add(new JButton("test1"));
panel.add(new JButton("test2"));
frame.getContentPane().add(panel);
frame.setSize(640, 480);
frame.setLocation(80, 60);
frame.setVisible(true);
}
catch(Throwable e)
{
e.printStackTrace();
System.exit(1);
}
}
}

import java.awt.Graphics;

import javax.swing.JComponent;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicPanelUI;


public class ImgPanelUI extends BasicPanelUI
{
private static ImgPanelUI instance = new ImgPanelUI();

public static ComponentUI getInstance()
{
return instance;
}

public void paint(Graphics g, JComponent c)
{
System.out.println("draw ImgPanel");
ImgPanel panel = (ImgPanel) c;
g.drawImage(panel.getImg(), 0, 0, panel.getWidth(), panel.getHeight(), panel);
super.paint(g, c);
}
}

这里的paint方法只会被调用一次
liad 2003-09-15
  • 打赏
  • 举报
回复
http://java.sun.com/docs/books/tutorial/uiswing/misc/icon.html
jncz 2003-09-15
  • 打赏
  • 举报
回复
你的竟然可以运行

在我这里死活都无法运行

uncatch error

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧