| package aurelienribon.utils.swing; |
| |
| import java.awt.Color; |
| import java.awt.Graphics; |
| import java.awt.Graphics2D; |
| import java.awt.Rectangle; |
| import java.awt.TexturePaint; |
| import java.awt.image.BufferedImage; |
| import java.io.File; |
| import java.io.IOException; |
| import java.net.URL; |
| import java.util.logging.Level; |
| import java.util.logging.Logger; |
| import javax.imageio.ImageIO; |
| import javax.swing.JPanel; |
| |
| /** |
| * @author Aurelien Ribon | http://www.aurelienribon.com |
| */ |
| public class ImagePanel extends JPanel { |
| private BufferedImage background; |
| private BufferedImage image; |
| private boolean useRegion; |
| private int x, y, width, height; |
| |
| public void setBackground(URL bgURL) { |
| try { |
| background = ImageIO.read(bgURL); |
| } catch (IOException ex) { |
| } |
| } |
| |
| public void clearImage() { |
| image = null; |
| repaint(); |
| } |
| |
| public void setImage(BufferedImage img) { |
| image = img; |
| repaint(); |
| } |
| |
| public void setImage(File img) { |
| setImage(img, 0, 0, 0, 0); |
| useRegion = false; |
| } |
| |
| public void setImage(URL imgUrl) { |
| setImage(imgUrl, 0, 0, 0, 0); |
| useRegion = false; |
| } |
| |
| public void setImage(File img, int x, int y, int width, int height) { |
| this.x = x; |
| this.y = y; |
| this.width = width; |
| this.height = height; |
| useRegion = true; |
| |
| try { |
| image = img != null ? ImageIO.read(img) : null; |
| repaint(); |
| } catch (IOException ex) { |
| Logger.getLogger(ImagePanel.class.getName()).log(Level.SEVERE, null, ex); |
| } |
| } |
| |
| public void setImage(URL imgUrl, int x, int y, int width, int height) { |
| this.x = x; |
| this.y = y; |
| this.width = width; |
| this.height = height; |
| useRegion = true; |
| |
| try { |
| image = imgUrl != null ? ImageIO.read(imgUrl) : null; |
| repaint(); |
| } catch (IOException ex) { |
| Logger.getLogger(ImagePanel.class.getName()).log(Level.SEVERE, null, ex); |
| } |
| } |
| |
| @Override |
| protected void paintComponent(Graphics g) { |
| Graphics2D gg = (Graphics2D)g; |
| gg.setColor(Color.LIGHT_GRAY); |
| gg.fillRect(0, 0, getWidth(), getHeight()); |
| |
| if (background != null) { |
| TexturePaint paint = new TexturePaint(background, new Rectangle(0, 0, background.getWidth(), background.getHeight())); |
| gg.setPaint(paint); |
| gg.fillRect(0, 0, getWidth(), getHeight()); |
| gg.setPaint(null); |
| } |
| |
| if (image != null && !useRegion) { |
| float panelRatio = (float)getWidth() / (float)getHeight(); |
| float imgRatio = (float)image.getWidth() / (float)image.getHeight(); |
| |
| if (imgRatio > panelRatio) { |
| float tw = (float)getWidth(); |
| float th = (float)getWidth() / imgRatio; |
| gg.drawImage(image, 0, (int)(getHeight()/2 - th/2), (int) tw, (int) th, null); |
| } else { |
| float tw = (float)getHeight() * imgRatio; |
| float th = (float)getHeight(); |
| gg.drawImage(image, (int)((float)getWidth()/2 - tw/2), 0, (int) tw, (int) th, null); |
| } |
| |
| } else if (image != null && useRegion) { |
| float panelRatio = (float)getWidth() / (float)getHeight(); |
| float imgRatio = (float)width / (float)height; |
| |
| if (imgRatio > panelRatio) { |
| int tw = getWidth(); |
| int th = (int) (getWidth() / imgRatio); |
| int tx = 0; |
| int ty = getHeight()/2 - th/2; |
| gg.drawImage(image, tx, ty, tx + tw, ty + th, x, y, x + width, y + width, null); |
| } else { |
| int tw = (int) (getHeight() * imgRatio); |
| int th = getHeight(); |
| int tx = getWidth()/2 - tw/2; |
| int ty = 0; |
| gg.drawImage(image, tx, ty, tx + tw, ty + th, x, y, x + width, y + width, null); |
| } |
| } |
| } |
| } |