ImagePanel.java

package ac.essex.ooechs.imaging.commons.util.panels; 
 
import ac.essex.ooechs.imaging.commons.PixelLoader; 
 
import javax.swing.*; 
import java.awt.image.BufferedImage; 
import java.awt.*; 
import java.awt.event.MouseEvent; 
 
/** 
 * Panel onto which an image can be drawn easily. 
 */ 
public class ImagePanel extends JPanel { 
 
    protected int zoom = 1; 
 
    protected BufferedImage image; 
 
    protected boolean setDisplayCentered = false; 
 
    protected boolean scale = false; 
 
    public ImagePanel() {} 
 
    public ImagePanel(PixelLoader image) { 
        setImage(image); 
    } 
 
    public void setImage(BufferedImage image) { 
        this.image = image; 
        repaint(); 
    } 
 
    public void setImage(PixelLoader image) { 
        setImage(image.getBufferedImage()); 
    } 
 
    public BufferedImage getImage() { 
        return image; 
    } 
 
    public void setDisplayCentered(boolean centered) { 
        this.setDisplayCentered = centered; 
        if (!centered) { 
            offsetX = 0; 
            offsetY = 0; 
        } 
    } 
 
    public void setScaling(boolean scale) { 
        this.scale = scale; 
    } 
 
    protected int offsetX = 0; 
    protected int offsetY = 0; 
 
    public int getOffsetX() { 
        return offsetX; 
    } 
 
    public int getOffsetY() { 
        return offsetY; 
    } 
 
    public int getX(MouseEvent e) { 
        return (e.getX() - offsetX) / zoom; 
    } 
 
    public int getY(MouseEvent e) { 
        return (e.getY() - offsetY) / zoom; 
    } 
 
    public void drawImage(Graphics g, BufferedImage image) { 
        if (!scale) { 
            g.drawImage(image, offsetX, offsetY, image.getWidth() * zoom, image.getHeight() * zoom, this); 
        } else { 
            g.drawImage(image, 0, 0, getWidth(), getHeight(), this); 
        } 
    } 
 
    public void zoomIn() { 
        zoom *= 2; 
        if (zoom > 32) zoom = 32; 
    } 
 
    public void zoomOut() { 
        zoom /= 2; 
        if (zoom < 1) zoom = 1; 
    } 
 
    public void setImageNull() { 
        image = null; 
    } 
 
    public void paintComponent(Graphics g) { 
 
        if (image != null) { 
 
            //super.paintComponent(g); 
            g.setColor(Color.BLACK); 
            g.fillRect(0, 0, getWidth(), getHeight()); 
 
            if (setDisplayCentered) { 
                offsetX = (getWidth() - (image.getWidth() * zoom)) / 2; 
                offsetY = (getHeight() - (image.getHeight() * zoom)) / 2; 
            } 
 
            drawImage(g, image); 
 
        } else { 
            g.setColor(Color.BLACK); 
            g.fillRect(0, 0, getWidth(), getHeight()); 
        } 
    } 
}