001package arcommon.image;
002
003import java.awt.Dimension;
004import java.awt.Graphics;
005import java.awt.Image;
006import java.awt.Rectangle;
007import java.awt.image.BufferedImage;
008
009import javax.swing.JComponent;
010
011public class SimpleImageJComponent extends JComponent {
012
013    private static final long serialVersionUID = -2450306462794033305L;
014    
015    private BufferedImage bufferedImage;
016    private boolean scaleImage = true;
017
018    private Rectangle displayRectangle;
019    
020    public SimpleImageJComponent() {
021        ;
022    }
023    
024    public SimpleImageJComponent(String fileName) {
025        bufferedImage = ImageUtil.loadFromFile(fileName);
026        update();
027    }
028    
029    public void paint(Graphics g) {
030        if (bufferedImage == null) {
031            return ;
032        }
033        
034        int componentWidth = getWidth() - 1;
035        int componentHeight = getHeight() - 1;
036        
037        int imageWidth = bufferedImage.getWidth();
038        int imageHeight = bufferedImage.getHeight();
039
040        float factor;
041        if (scaleImage) {
042            factor = (float)componentHeight / imageHeight;
043            if (factor * imageWidth > componentWidth) {
044                factor = (float)componentWidth / imageWidth;
045            }
046        } else {
047            factor = 1;
048        }
049        
050        int width = (int)(factor * imageWidth);
051        int height = (int)(factor * imageHeight);
052        int x = (componentWidth - width) / 2;
053        int y = (componentHeight - height) / 2;
054        
055        displayRectangle = new Rectangle(x, y, width, height);
056        
057        paintAt(g, x, y, width, height);
058    }
059    
060    public void paintAt(Graphics g, int x, int y, int width, int height) {
061        g.drawImage(bufferedImage, x, y, width, height, null);
062    }
063    
064    public int getBufferedImageWidth() {
065        return bufferedImage.getWidth();
066    }
067    
068    public int getBufferedImageHeight() {
069        return bufferedImage.getHeight();
070    }
071    
072    public Rectangle getDisplayRectangle() {
073        return displayRectangle;
074    }
075    
076    private void update() {
077        if (scaleImage) {
078            setPreferredSize(new Dimension(1, 1));
079        } else {
080            if (bufferedImage != null) {
081                setPreferredSize(new Dimension(bufferedImage.getWidth(), bufferedImage.getHeight()));
082            }
083        }
084        revalidate();
085        repaint();
086    }
087
088    public Image getBufferedImage() {
089        return bufferedImage;
090    }
091
092    public void setBufferedImage(BufferedImage pimage) {
093        bufferedImage = pimage;
094        update();
095    }
096    
097    public boolean getScaleImage() {
098        return scaleImage;
099    }
100
101    public void setScaleImage(boolean pscaleImage) {
102        scaleImage = pscaleImage;
103        update();
104    }
105}