在JPanel上画图时为何paint()方法会被多次调用? 你的竟然可以运行在我这里死活都无法运行uncatch error 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://java.sun.com/docs/books/tutorial/uiswing/misc/icon.html 通过实现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方法只会被调用一次 Applet的例子就请不要拿过了,我要的是Frame下的。运行环境是win2000+jdk1.3.1 我在我的机子上测试过了,只打到15就可以了,但估计不停的paint像是一个缓冲一样,在图片很大,没法一次画出来的时候,隔几秒就自动执行一下paint,直到图片出来为止 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); }} 小小聊天系统 帮忙看看 数字年月日转中文,讨论 怎么在表格中添加复选框 关于thinking in java 中的一个疑问 求助读入 读写问题 问个JApplet相关的菜鸟问题? 制作jar文件的方法 实际项目中有没有用到过JSF的 java中求二叉树的所有节点值的汇总的算法 刚开始学java请问java有没有好的集成开发环境? 怎么做带有checkbox的Tree控件? 如何将自己编写的UI 的JavaBean 集成到JBuilder7中?
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方法只会被调用一次
在你的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);
}
}