package tutorial.support; 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 = new JLabel(); public void setImage( BufferedImage image ){ this.image = image; if( image != null ){ 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.setIcon( new ImageIcon( image ) ); setIcon( new ImageIcon( thumbnail ) ); setText( "Press the mouse to enlarge the image" ); setVerticalTextPosition( BOTTOM ); setHorizontalTextPosition( CENTER ); } else{ thumbnail = null; setIcon( null ); setText( null ); label.setIcon( null ); } } /** * 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 && image != 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; } } } }