views:

2972

answers:

2

I posted earlier about having a really messed up panel but fixed that by simply changing the layout (thank you to Charlie Martin for helping me). Now, I'm trying to add an image to a panel so I can add that panel to the frame. This is part of the class that I am messing around with.

http://friendpaste.com/13zibFC4oVxCbm83500KVj

This is what comes up when I run the program and hit start game (on the startup popup).. http://i43.tinypic.com/9tg3uv.jpg

Essentially, there is supposed to be an image on the main window along with the buttons and I'm not exactly sure how I would go about implementing this.

+2  A: 

I'd probably just set an ImageIcon on a JLabel and add the JLabel where you want in the panel.

Tom
A: 

Please, please, please -don't- use the JLabel. While that -is- the easiest way, it's also bad practice and causes problems when you have images that aren't the actual size you want displayed.

The second answer is on the right path, but still has the same problem.

Here's a class I've written in the past which is what you need:

It will also allow you to set the specific size if you want; it will scale the image to best fit the panel, and align the image as well.

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Insets;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.SwingConstants;

public class ImagePanel extends JComponent implements SwingConstants, Printable {

    private Image image;
    private int verticalAlignment = CENTER;
    private int horizontalAlignment = CENTER;

    public ImagePanel() {}

    public ImagePanel(Image image) {
     setImage(image);
    }

    public Image getImage() {
     return image;
    }

    public void setImage(Image image) {
     this.image = image;
     repaint();
    }

    public void setImage(String file) {
     setImage(new ImageIcon(file).getImage());
    }

    public void setImage(File file) {
     setImage(new ImageIcon(file.getAbsolutePath()).getImage());
    }

    public void setImage(byte[] imageData) {
     setImage(imageData==null ? null : new ImageIcon(imageData).getImage());
    }

    public int getVerticalAlignment() {
     return verticalAlignment;
    }

    /**
     * @beaninfo
     *        bound: true
     *         enum: TOP    SwingConstants.TOP
     *               CENTER SwingConstants.CENTER
     *               BOTTOM SwingConstants.BOTTOM
     *    attribute: visualUpdate true
     *  description: The alignment of the image along the Y axis.  
     */
    public void setVerticalAlignment(int verticalAlignment) {
     if( (verticalAlignment==TOP) || (verticalAlignment==CENTER) || (verticalAlignment==BOTTOM) )
      this.verticalAlignment = verticalAlignment;
     else
      throw new IllegalArgumentException("Invalid Vertical Alignment: " + verticalAlignment);
    }

    public int getHorizontalAlignment() {
     return horizontalAlignment;
    }

    /**
     * @beaninfo
     *        bound: true
     *         enum: LEFT    SwingConstants.LEFT
     *               CENTER SwingConstants.CENTER
     *               RIGHT SwingConstants.RIGHT
     *    attribute: visualUpdate true
     *  description: The alignment of the image along the X axis.  
     */
    public void setHorizontalAlignment(int horizontalAlignment) {
     if( (horizontalAlignment==LEFT) || (horizontalAlignment==CENTER) || (horizontalAlignment==RIGHT) )
      this.horizontalAlignment = horizontalAlignment;
     else
      throw new IllegalArgumentException("Invalid Horizontal Alignment: " + horizontalAlignment);
    }

    @Override
    public Dimension getPreferredSize() {
     if(image == null)
      return super.getPreferredSize();
     else
      return new Dimension(image.getWidth(this), image.getHeight(this));
    }

    @Override
    protected void paintComponent(Graphics g) {
     super.paintComponent(g);

     if(image==null)
      return;

     Insets insets = getInsets();
     int x = insets.left;
     int y = insets.top;

     int w = getWidth() - insets.left - insets.right;
     int h = getHeight() - insets.top - insets.bottom;

     int src_w = image.getWidth(null);
     int src_h = image.getHeight(null);

     double scale_x = ((double)w)/src_w;
     double scale_y = ((double)h)/src_h;

     double scale = Math.min(scale_x, scale_y);

     int dst_w = (int)(scale * src_w);
     int dst_h = (int)(scale * src_h);

     int dx = x + (w-dst_w)/2;
     if(horizontalAlignment==LEFT)
      dx = x;
     else if(horizontalAlignment==RIGHT)
      dx = x + w - dst_w; 

     int dy = y + (h-dst_h)/2;
     if(verticalAlignment==TOP)
      dy = y;
     else if(verticalAlignment==BOTTOM)
      dy = y + h - dst_h; 

     g.drawImage(image, dx, dy, dx+dst_w, dy+dst_h, 0, 0, src_w, src_h, null);
    }

    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {

     if(pageIndex>0 || image==null)
      return NO_SUCH_PAGE;

     double w = pageFormat.getImageableWidth();
     double h = pageFormat.getImageableHeight();

     int src_w = image.getWidth(null);
     int src_h = image.getHeight(null);

     double scale_x = w/src_w;
     double scale_y = h/src_h;

     double scale = Math.min(scale_x, scale_y);

     int dst_w = (int)(scale * src_w);
     int dst_h = (int)(scale * src_h);

     int dx = (int)((w-dst_w)/2);

     int dy = (int)((h-dst_h)/2);

     graphics.drawImage(image, dx, dy, dx+dst_w, dy+dst_h, 0, 0, src_w, src_h, null);

     return PAGE_EXISTS;
    }
}
Milan Ramaiya
Well, I don't need all of the features you said "It will also allow you to set the specific size if you want; it will scale the image to best fit the panel, and align the image as well."... All I'm trying to do is add an image under the buttons in the program. -_-
Tyler