import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.awt.image.FilteredImageSource;
import java.awt.image.RGBImageFilter;
import javax.swing.AbstractAction;
import javax.swing.BoundedRangeModel;
import javax.swing.DefaultBoundedRangeModel;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLayer;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.WindowConstants;
import javax.swing.plaf.LayerUI;
public class Main {
public static void main(String[] args) {
BoundedRangeModel model = new DefaultBoundedRangeModel();
BlockedColorLayerUI layerUI = new BlockedColorLayerUI();
JPanel p = new JPanel(new GridLayout(2, 1, 12, 12));
p.add(new JLayer(new JProgressBar(model), layerUI));
JPanel box = new JPanel();
box.add(new JButton(new AbstractAction("+10") {
private int i = 0;
@Override
public void actionPerformed(ActionEvent e) {
model.setValue(i = (i >= 100) ? 0 : i + 10);
}
}));
p.repaint();
JPanel panel = new JPanel(new BorderLayout());
panel.add(p, BorderLayout.NORTH);
panel.add(box, BorderLayout.SOUTH);
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(panel);
f.setSize(320, 240);
f.setVisible(true);
}
}
class BlockedColorLayerUI extends LayerUI {
BufferedImage bi;
int prevw, prevh;
@Override
public void paint(Graphics g, JComponent c) {
JLayer jlayer = (JLayer) c;
JProgressBar progress = (JProgressBar) jlayer.getView();
int w = progress.getSize().width;
int h = progress.getSize().height;
if (bi == null || w != prevw || h != prevh) {
bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
}
prevw = w;
prevh = h;
Graphics2D g2 = bi.createGraphics();
super.paint(g2, c);
g2.dispose();
Image image = c.createImage(new FilteredImageSource(bi.getSource(),
new RedGreenChannelSwapFilter()));
g.drawImage(image, 0, 0, c);
}
}
class RedGreenChannelSwapFilter extends RGBImageFilter {
@Override
public int filterRGB(int x, int y, int argb) {
int r = (int) ((argb >> 16) & 0xff);
int g = (int) ((argb >> 8) & 0xff);
int b = (int) ((argb) & 0xff);
return (argb & 0xff000000) | (g << 16) | (r << 8) | (b);
}
}