package bibliothek.demonstration; import java.awt.Image; import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.Popup; import javax.swing.PopupFactory; import javax.swing.SwingUtilities; /** * A panel that shows a thumbnail of an image. When the user presses the mouse * on this panel, a popup will appear showing the full sized image. * @author Benjamin Sigg * */ public class ImagePanel extends JLabel{ /** the full sized image */ private BufferedImage image; /** the thumbnail of {@link #image} */ private Image thumbnail; /** the label showing {@link #image} */ private JLabel label; /** * Creates a new panel. * @param image the image from which a thumbnail will be fetched */ public ImagePanel( BufferedImage image ){ if( image != null ){ this.image = image; double factor = Math.min( 300.0 / image.getWidth(), 200.0 / image.getHeight() ); thumbnail = image.getScaledInstance( (int)(image.getWidth()*factor), (int)(image.getHeight()*factor), Image.SCALE_SMOOTH ); addMouseListener( new Listener() ); label = new JLabel( new ImageIcon( image )); setIcon( new ImageIcon( thumbnail ) ); setText( "Press the mouse to enlarge the image" ); setVerticalTextPosition( BOTTOM ); setHorizontalTextPosition( CENTER ); } } /** * A listener to an {@link ImagePanel}, this listener opens a * popup showing the full sized image of the enclosing <code>ImagePanel</code>. * @author Benjamin Sigg * */ private class Listener extends MouseAdapter{ /** the window that shows the full sized image */ private Popup popup; @Override public void mousePressed( MouseEvent e ){ if( popup == null ){ Point location = new Point( (getWidth() - image.getWidth())/2, (getHeight() - image.getHeight())/2 ); SwingUtilities.convertPointToScreen( location, ImagePanel.this ); popup = PopupFactory.getSharedInstance().getPopup( ImagePanel.this, label, location.x, location.y ); popup.show(); } } @Override public void mouseReleased( MouseEvent e ){ if( popup != null ){ popup.hide(); popup = null; } } } }