18f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggipackage aurelienribon.utils.swing; 28f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 38f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.awt.Color; 48f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.awt.Graphics; 58f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.awt.Graphics2D; 68f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.awt.Rectangle; 78f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.awt.TexturePaint; 88f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.awt.image.BufferedImage; 98f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.io.File; 108f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.io.IOException; 118f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.net.URL; 128f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.util.logging.Level; 138f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport java.util.logging.Logger; 148f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport javax.imageio.ImageIO; 158f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggiimport javax.swing.JPanel; 168f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 178f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi/** 188f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi * @author Aurelien Ribon | http://www.aurelienribon.com 198f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi */ 208f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggipublic class ImagePanel extends JPanel { 218f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi private BufferedImage background; 228f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi private BufferedImage image; 238f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi private boolean useRegion; 248f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi private int x, y, width, height; 258f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 268f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi public void setBackground(URL bgURL) { 278f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi try { 288f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi background = ImageIO.read(bgURL); 298f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } catch (IOException ex) { 308f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } 318f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } 328f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 338f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi public void clearImage() { 348f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi image = null; 358f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi repaint(); 368f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } 378f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 388f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi public void setImage(BufferedImage img) { 398f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi image = img; 408f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi repaint(); 418f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } 428f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 438f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi public void setImage(File img) { 448f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi setImage(img, 0, 0, 0, 0); 458f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi useRegion = false; 468f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } 478f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 488f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi public void setImage(URL imgUrl) { 498f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi setImage(imgUrl, 0, 0, 0, 0); 508f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi useRegion = false; 518f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } 528f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 538f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi public void setImage(File img, int x, int y, int width, int height) { 548f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi this.x = x; 558f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi this.y = y; 568f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi this.width = width; 578f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi this.height = height; 588f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi useRegion = true; 598f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 608f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi try { 618f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi image = img != null ? ImageIO.read(img) : null; 628f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi repaint(); 638f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } catch (IOException ex) { 648f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi Logger.getLogger(ImagePanel.class.getName()).log(Level.SEVERE, null, ex); 658f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } 668f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } 678f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 688f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi public void setImage(URL imgUrl, int x, int y, int width, int height) { 698f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi this.x = x; 708f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi this.y = y; 718f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi this.width = width; 728f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi this.height = height; 738f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi useRegion = true; 748f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 758f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi try { 768f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi image = imgUrl != null ? ImageIO.read(imgUrl) : null; 778f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi repaint(); 788f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } catch (IOException ex) { 798f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi Logger.getLogger(ImagePanel.class.getName()).log(Level.SEVERE, null, ex); 808f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } 818f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } 828f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 838f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi @Override 848f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi protected void paintComponent(Graphics g) { 858f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi Graphics2D gg = (Graphics2D)g; 868f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi gg.setColor(Color.LIGHT_GRAY); 878f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi gg.fillRect(0, 0, getWidth(), getHeight()); 888f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 898f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi if (background != null) { 908f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi TexturePaint paint = new TexturePaint(background, new Rectangle(0, 0, background.getWidth(), background.getHeight())); 918f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi gg.setPaint(paint); 928f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi gg.fillRect(0, 0, getWidth(), getHeight()); 938f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi gg.setPaint(null); 948f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } 958f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 968f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi if (image != null && !useRegion) { 978f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi float panelRatio = (float)getWidth() / (float)getHeight(); 988f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi float imgRatio = (float)image.getWidth() / (float)image.getHeight(); 998f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 1008f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi if (imgRatio > panelRatio) { 1018f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi float tw = (float)getWidth(); 1028f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi float th = (float)getWidth() / imgRatio; 1038f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi gg.drawImage(image, 0, (int)(getHeight()/2 - th/2), (int) tw, (int) th, null); 1048f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } else { 1058f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi float tw = (float)getHeight() * imgRatio; 1068f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi float th = (float)getHeight(); 1078f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi gg.drawImage(image, (int)((float)getWidth()/2 - tw/2), 0, (int) tw, (int) th, null); 1088f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } 1098f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 1108f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } else if (image != null && useRegion) { 1118f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi float panelRatio = (float)getWidth() / (float)getHeight(); 1128f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi float imgRatio = (float)width / (float)height; 1138f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi 1148f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi if (imgRatio > panelRatio) { 1158f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi int tw = getWidth(); 1168f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi int th = (int) (getWidth() / imgRatio); 1178f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi int tx = 0; 1188f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi int ty = getHeight()/2 - th/2; 1198f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi gg.drawImage(image, tx, ty, tx + tw, ty + th, x, y, x + width, y + width, null); 1208f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } else { 1218f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi int tw = (int) (getHeight() * imgRatio); 1228f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi int th = getHeight(); 1238f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi int tx = getWidth()/2 - tw/2; 1248f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi int ty = 0; 1258f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi gg.drawImage(image, tx, ty, tx + tw, ty + th, x, y, x + width, y + width, null); 1268f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } 1278f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } 1288f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi } 1298f2ef8f2d70edcfa159195e2efd23f95ff1b5789Jorim Jaggi} 130