【问题标题】:Adding an image to a panel using Java AWT使用 Java AWT 将图像添加到面板
【发布时间】:2010-10-16 06:40:44
【问题描述】:

我之前发布过关于面板非常混乱的帖子,但是我通过简单地更改布局来解决这个问题(感谢 Charlie Martin 的帮助)。现在,我正在尝试将图像添加到面板中,以便可以将该面板添加到框架中。这是我正在搞砸的课程的一部分。

http://friendpaste.com/13zibFC4oVxCbm83500KVj (死链接)

这是当我运行程序并点击开始游戏时出现的(在启动弹出窗口中)..

基本上,主窗口上应该有一个图像以及按钮,我不确定我将如何实现这一点。

【问题讨论】:

    标签: java image awt frames panels


    【解决方案1】:

    我可能只是在 JLabel 上设置一个 ImageIcon 并将 JLabel 添加到面板中您想要的位置。

    【讨论】:

      【解决方案2】:

      请,请,请-不要-使用 JLabel。虽然这是最简单的方法,但它也是不好的做法,并且当您的图像不是您想要显示的实际尺寸时会导致问题。

      第二个答案是正确的,但仍然有同样的问题。

      这是我过去写的一个课程,这是你需要的:

      它还允许您根据需要设置特定大小;它将缩放图像以最适合面板,并对齐图像。

      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;
          }
      }
      

      【讨论】:

      • 好吧,我不需要你说的所有功能“如果你愿意,它还允许你设置特定的大小;它会缩放图像以最适合面板,并对齐图像也是如此。”...我要做的就是在程序的按钮下添加一个图像。 -_-
      猜你喜欢
      • 2012-10-26
      • 2012-11-27
      • 1970-01-01
      • 2012-11-26
      • 2011-11-26
      • 1970-01-01
      • 2011-10-28
      • 2015-10-27
      • 1970-01-01
      相关资源
      最近更新 更多