Test.javaimport java.net.URL;import java.awt.Frame;
import java.awt.Image;
import java.awt.Insets;
import java.awt.MediaTracker;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.ImageProducer;public class Test extends Frame implements Runnable
{
    Image tiger;
    boolean showing = false;
    Dissolver dissolver = null;
    int x,y;    public Test()
    {
        super("Image Dissolver");        MediaTracker mt = new MediaTracker(this);
        URL url = getClass().getResource("Tiger.gif");        try
        {
            tiger = createImage((ImageProducer)url.getContent());
            mt.addImage(tiger,0);
            mt.waitForID(0);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }    public void addNotify()
    {
        super.addNotify();        Insets i = getInsets();
        dissolver = new Dissolver(this,x = i.left,y = i.top,30,10);        synchronized(dissolver)
        {
            ImageProducer ip = tiger.getSource();
            ip.startProduction(dissolver);
            try
            {
                dissolver.wait(); // wait for dissolved images ...
            }
            catch(Exception e) // wait() was interrupted
            {
                e.printStackTrace();
            }
        }
        try
        {
            Thread thread = new Thread(this);
            thread.start();
        }
        catch(Exception e) // thread was interrupted
        {
            e.printStackTrace();
        }
    }    public void run()
    {
        while(true)
        {
            if(isShowing())
            {
                if(showing)
                {
                    dissolver.fadeOut();
                }
                else
                {
                    dissolver.fadeIn();
                }
                showing = showing ? false : true;                try
                {
                    Thread.currentThread().sleep(1000);
                }
                catch(Exception e)
                {
                    e.printStackTrace();
                }
            }
        }
    }    public static void main(String args[])
    {
        final Test f = new Test();
        f.setBounds(100,100,375,375);
        f.setVisible(true);        f.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                f.dispose();
                System.exit(0);
            }
        });
    }
}

解决方案 »

  1.   

    Dissolver.javaimport java.awt.Component;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.MediaTracker;
    import java.awt.image.ColorModel;
    import java.awt.image.FilteredImageSource;
    import java.awt.image.ImageConsumer;
    import java.awt.image.MemoryImageSource;class Dissolver implements ImageConsumer
    {
        Image images[];
        Image image,offscreen;
        ColorModel defaultRGB = ColorModel.getRGBdefault();
        Component component;
        Graphics g,offg;
        int intPixels[],x,y,width,height,pauseInterval;
        int numImages;    public Dissolver(Component c,int x,int y)
        {
            this(c,x,y,10,50);
        }    public Dissolver(Component c,int x,int y,int numImages,int pauseInterval)
        {
            this.component = c;
            this.numImages = numImages;
            this.pauseInterval = pauseInterval;
            this.x = x;
            this.y = y;        images = new Image[numImages];
        }    public void setColorModel(ColorModel model)
        {
        // don't care - we use our own in imageComplete(),
        // and the one passed into setPixels()
        }    public void setHints(int hints)
        {
        // don't care
        }    public void setProperties(java.util.Hashtable props)
        {
        // don't care
        }    public void setDimensions(int width,int height)
        {
            this.width = width;
            this.height = height;
            intPixels = new int[width * height];
        }    public void setPixels(int x,int y,int w,int h,ColorModel model,int[] pixels,int offset,int scansize)
        {
            for(int r = 0;r < h;++r)
            {
                for(int c = 0;c < w;++c)
                {
                    int index = offset + r * scansize + c;
                    intPixels[index] = model.getRGB(pixels[index] & 0xff);
                }
            }
        }    public void setPixels(int x,int y,int w,int h,ColorModel model,byte[] pixels,int offset,int scansize)
        {
            for(int r = 0;r < h;++r)
            {
                for(int c = 0;c < w;++c)
                {
                    int index = offset + r * scansize + c;
                    intPixels[index] = model.getRGB(pixels[index] & 0xff);
                }
            }
        }    public synchronized void imageComplete(int status)
        {
            if(status == IMAGEERROR || status == IMAGEABORTED)
            {
                return;
            }
            MemoryImageSource mis = new MemoryImageSource(width,height,defaultRGB,intPixels,0,width);
            image = component.createImage(mis);        makeDissolvedImages(); // this takes some time, so ...
            notifyAll(); // notify all threads waiting on us
        }    private void makeDissolvedImages()
        {
            MediaTracker mt = new MediaTracker(component);
            DissolveFilter filter;        for(int i = 0;i < images.length;++i)
            {
                filter = new DissolveFilter((255 / (numImages - 1)) * i);            FilteredImageSource fis = new FilteredImageSource(image.getSource(),filter);
                images[i] = component.createImage(fis);
                mt.addImage(images[i],i);
            }
            mt.addImage(image,numImages);
            try
            {
                mt.waitForAll();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }    public void fadeOut()
        {
            if(offscreen == null)
            {
                offscreen = component.createImage(width,height);
            }
            offg = offscreen.getGraphics();
            g = component.getGraphics();        if(offg != null && g != null)
            {
                try
                {
                    for(int i = numImages - 1;i >= 0;--i)
                    {
                        clearOffscreen();
                        blitImage(images[i]);
                        pause();
                    }
                }
                finally
                {
                    offg.dispose();
                    g.dispose();
                }
            }
        }    public void fadeIn()
        {
            if(offscreen == null)
            {
                offscreen = component.createImage(width,height);
            }
            offg = offscreen.getGraphics();
            g = component.getGraphics();        if(offg != null && g != null)
            {
                try
                {
                    for(int i = 0;i < numImages;++i)
                    {
                        clearOffscreen();
                        blitImage(images[i]);
                        pause();
                    }
                    blitImage(image);
                }
                finally
                {
                    offg.dispose();
                    g.dispose();
                }
            }
        }    private void blitImage(Image im)
        {
            offg.drawImage(im,0,0,component);
            g.drawImage(offscreen,x,y,component);
        }    private void clearOffscreen()
        {
            offg.setColor(component.getBackground());
            offg.fillRect(0,0,width,height);
        }    private void pause()
        {
            try
            {
                Thread.currentThread().sleep(pauseInterval);
            }
            catch(InterruptedException e)
            {
            }
        }
    }
      

  2.   

    DissolveFilter.javaimport java.awt.image.ColorModel;
    import java.awt.image.ImageFilter;class DissolveFilter extends ImageFilter
    {
        ColorModel defaultRGB = ColorModel.getRGBdefault();
        int sineArray[],pixelRow[],alpha,width,height;    public DissolveFilter()
        {
            this(100);
        }    public DissolveFilter(int alpha)
        {
            if(alpha < 0 || alpha > 255)
            {
                throw new IllegalArgumentException("bad alpha argument");
            }        this.alpha = alpha;
        }    public void setDimensions(int width,int height)
        {
            int x;
            this.width = width;
            this.height = height;
            pixelRow = new int[width];
            consumer.setDimensions(width,height);
        }    public void setColorModel(ColorModel model)
        {
            consumer.setColorModel(defaultRGB);
        }    public void setPixels(int x,int y,int w,int h,ColorModel cm,int pixels[],int offset,int scansize)
        {
            int pixel,index,originalAlpha;        for(int row = 0;row < h;row++)
            {
                for(int col = 0;col < w;col++)
                {
                    index = offset + row * scansize + col;
                    pixel = cm.getRGB(pixels[index]);
                    originalAlpha = defaultRGB.getAlpha(pixel);                pixel = originalAlpha == 0 ? 0 : alpha << 24 |
                        defaultRGB.getRed(pixel) << 16 |
                        defaultRGB.getGreen(pixel) << 8 |
                        defaultRGB.getBlue(pixel);                pixelRow[col] = pixel;
                }
                consumer.setPixels(x,y + row,w,1,defaultRGB,pixelRow,0,w);
            }
        }    public void setPixels(int x,int y,int w,int h,ColorModel cm,byte pixels[],int offset,int scansize)
        {
            int pixel,index,originalAlpha;        for(int row = 0;row < h;row++)
            {
                for(int col = 0;col < w;col++)
                {
                    index = offset + row * scansize + col;
                    pixel = cm.getRGB(pixels[index] & 0xff);                originalAlpha = defaultRGB.getAlpha(pixel);                pixel = originalAlpha == 0 ? 0 : alpha << 24 |
                        defaultRGB.getRed(pixel) << 16 |
                        defaultRGB.getGreen(pixel) << 8 |
                        defaultRGB.getBlue(pixel);                pixelRow[col] = pixel;
                }
                consumer.setPixels(x,y + row,w,1,defaultRGB,pixelRow,0,w);
            }
        }
    }
      

  3.   

    URL url = getClass().getResource("Tiger.gif");
    change to:
    Test.class.getResource("Tiger.gif");