/* Copyright 2008-2010 Gephi Authors : Mathieu Bastian <mathieu.bastian@gephi.org> Website : http://www.gephi.org This file is part of Gephi. Gephi is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Gephi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Gephi. If not, see <http://www.gnu.org/licenses/>. */ package org.gephi.ui.components; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.awt.MediaTracker; import java.awt.image.PixelGrabber; import javax.swing.JPanel; import javax.swing.SwingConstants; //Copied from org.netbeans.lib.profiler.ui.components //author Jiri Sedlacek public class JImagePanel extends JPanel { //~ Static fields/initializers ----------------------------------------------------------------------------------------------- private static MediaTracker mTracker = new MediaTracker(new JPanel()); //~ Instance fields ---------------------------------------------------------------------------------------------------------- private Image image; private int imageAlign; // Use SwingConstants.TOP, BOTTOM (LEFT & RIGHT not implemented) //~ Constructors ------------------------------------------------------------------------------------------------------------- public JImagePanel(Image image) { this(image, SwingConstants.TOP); } public JImagePanel(Image image, int imageAlign) { setImage(image); setImageAlign(imageAlign); } //~ Methods ------------------------------------------------------------------------------------------------------------------ public void setImage(Image image) { this.image = loadImage(image); if (this.image == null) { throw new RuntimeException("JImagePanel failed to load image"); // NOI18N } setPreferredBackground(); setPreferredSize(new Dimension(this.image.getWidth(null), this.image.getHeight(null))); refresh(); } public void setImageAlign(int imageAlign) { this.imageAlign = imageAlign; setPreferredBackground(); refresh(); } protected static Image loadImage(Image image) { mTracker.addImage(image, 0); try { mTracker.waitForID(0); } catch (InterruptedException e) { return null; } mTracker.removeImage(image, 0); return image; } protected void setPreferredBackground() { int[] pixels = new int[1]; PixelGrabber pg = null; switch (imageAlign) { case (SwingConstants.TOP): pg = new PixelGrabber(image, 0, image.getHeight(null) - 1, 1, 1, pixels, 0, 1); break; case (SwingConstants.BOTTOM): pg = new PixelGrabber(image, 0, 0, 1, 1, pixels, 0, 1); break; default: pg = new PixelGrabber(image, 0, image.getHeight(null) - 1, 1, 1, pixels, 0, 1); } try { if ((pg != null) && pg.grabPixels()) { setBackground(new Color(pixels[0])); } } catch (InterruptedException e) { } } protected void paintComponent(Graphics graphics) { graphics.setColor(getBackground()); graphics.fillRect(0, 0, getWidth(), getHeight()); switch (imageAlign) { case (SwingConstants.TOP): graphics.drawImage(image, (getWidth() - image.getWidth(null)) / 2, 0, this); break; case (SwingConstants.BOTTOM): graphics.drawImage(image, (getWidth() - image.getWidth(null)) / 2, getHeight() - image.getHeight(null), this); break; default: graphics.drawImage(image, (getWidth() - image.getWidth(null)) / 2, 0, this); } } private void refresh() { if (isShowing()) { invalidate(); repaint(); } } }