本帖最后由 wo6925371 于 2010-03-16 12:55:32 编辑

解决方案 »

  1.   

    其实主要不理解的是go()方法中repaint()为什么没有调用paintComponent()方法!!??
      

  2.   

    你的paintComponent()方法把图片绘制到了同一个位置,这次的绘制会覆盖上次的绘制的。另外,为了提高效率,你应该在paintComponent()方法里写for循环,画4个图片。
      

  3.   

    请大家注意 go()方法中的repaint()为什么不调用paintComponent()方法!!??
      

  4.   

    谁告诉你repaint()就会调paintComponent()方法?请看JComponent的源码:
      public void repaint(long tm, int x, int y, int width, int height) {
            RepaintManager.currentManager(this).addDirtyRegion(this, x, y, width,  height);
        }
    仅仅是在RepaintManager中设置需要重画的Dirty Region,至于什么时候重画,同RepaintManager决定,所以往往是同一线程多次调用repaint只会产生一次重画调用,
    建议用父面板的 UpdateUI() 之类的调用试试,或者再开专门动画绘制的一个线程
      

  5.   

    看不懂源码啊。能详细点说它为什么不调用paintComponent()方法吗!!??
      

  6.   

    建议通过重写paint()方法来实现。这样你用repaint()方法就比较好了。
      

  7.   

    重写paint()方法还是一样 go()方法中的repaint()还是不调用!
      

  8.   

    那就是你的代码问题了。我看了下,你的go()方法只调用了一次,那么当然只会显示一张图片了。
        你可以在go()方法里做一个循环,循环四次,每一次都调用一次repaint()方法,同时每一次睡上一小段时间,同时要让paint()方法自己本身循环显示4张图片。
      

  9.   

    不对呀,go()方法是走了四次  输出了四个System.out.println("够着方法");
    而paint()方法就走了一次  只输出了一个System.out.println("g方法执行");
      

  10.   

    我改了一下,正常执行,调用四次。package com.GUI;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.MediaTracker;
    import java.util.Random;import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JPanel;public class MyFrame extends JPanel {    Random random=new Random();
        Image imge;
        int rand;
        JFrame jf = new JFrame();
        
        public MyFrame(){
         jf.add(this);
         jf.setSize(300,400);
         jf.setVisible(true);
        }
            public void go() {        // private Image image[]=new Image[4];
            String[] filename = { "c:\\01.JPG",
                    "c:\\02.JPG",
                    "c:\\03.JPG",
                    "c:\\04.JPG"};
            ImageIcon[] images = new ImageIcon[10];        MediaTracker tracker = new MediaTracker(this);
            for (int i = 0; i < 4; i++) {
                System.out.println("够着方法");
                rand=(int)random.nextInt(4);
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                images[i] = new ImageIcon(filename[rand]);
                imge = images[i].getImage();            tracker.addImage(imge, i);            try {
                    tracker.waitForID(1);            } catch (InterruptedException exception) {            }
                repaint();
            }
        }
        
        public void paint(Graphics g) {
         System.out.println("paint");
        }
                                       
        public static void main(String[] args) {
         new MyFrame().go();
    }
        
    }
    建议你在ImagePanel的构造方法里加一句,this.setVisible(true);试一下。
    调用了repaint()方法但没有调用paint()方法的原因是这个panel还没被draw出来。
      

  11.   

    再说一遍,repaint()只是告诉RepaintManager需要重画的区域,并不会调用paint去重画,而RepaintManager有一种机制自动判断什么时候重画,一般来说在同一线程里多次调用repaint()会导致RepaintManager将多次调用设置的区域合并计算,变成一次调用,其实你的目的很简单,只想调动paint将图片不停地切换,这样只需把 repaint() 直接换成
                Graphics g = getGraphics();
               paint(g);
    就OK了
      

  12.   

    在最初的重画请求处理完成之前,如果在该部件上有多次对repaint()的调用,那么这些调用可以被合并成对update()的一次调用。决定什么时候应该合并多次请求的运算法则取决于具体的实现。如果多次请求被合并,最终被更新的区域将是所有这些请求所要求更新的区域的联合(union)。看源码吧