package infinitefiltertest; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.image.ColorModel; import java.awt.image.FilteredImageSource; import java.awt.image.ImageFilter; import java.awt.image.ImageProducer; import java.awt.image.MemoryImageSource; import java.awt.image.RGBImageFilter; import javax.swing.JComponent; import javax.swing.JFrame; public class InfiniteFilterTest { public static void main(String[] args) { final int w = 100; final int h = 100; int[] buf = new int[w * h]; java.util.Arrays.fill(buf, 0xffff0000); MemoryImageSource s = new MemoryImageSource(w, h, ColorModel.getRGBdefault(), buf, 0, 0); final Image i = Toolkit.getDefaultToolkit().createImage(s); JFrame f = new JFrame("Filter"); f.add(new JComponent() { Image image = i; int count = 0; public Dimension getPreferredSize() { return new Dimension(w, h); } public void paintComponent(Graphics g) { ImageFilter f = new RGBImageFilter() { @Override public int filterRGB(int x, int y, int rgb) { switch (rgb) { case 0xFFFF0000: return 0xFF00FF00; case 0xFF00FF00: return 0xFF0000FF; case 0xFF0000FF: return 0xFFFF0000; default: return 0xFFFF0000; } } }; count += 1; // note: we add next element to the consumers's chain ImageProducer p = new FilteredImageSource(image.getSource(), f); image = Toolkit.getDefaultToolkit().createImage(p); g.drawImage(image, 0, 0, this); System.out.println("Count: " + count); } }); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.pack(); f.setVisible(true); } }