繁体   English   中英

无法将图像添加到JPanel

[英]Trouble adding Image to a JPanel

我正在制作视频游戏,我需要将图像添加到JPanel,然后将该JPanel添加到JFrame。 我见过的所有教程都说过将其添加到JLabel中,但是图像必须能够移动。 除非您可以随意移动JLabel,否则我无法这样做。 如何将图像直接添加到JPanel。 这是我到目前为止所拥有的,但是就像在JApplet上一样

class Penguin extends JPanel {

    public Image image;

    public void paintComponent( Graphics g ) {

        image = getImage( getDocumentBase(), "Penguins.jpg" );
        g.drawImage( image, 0, 0, this );
    }
}

您可以轻松地移动JLabel,因此这仍然是一个可行的选择,并且有许多技巧可以使您做到这一点,包括使用JLayeredPane或玻璃窗格。 但是,话虽如此,在JPanel中绘制图像仍然不难(我敢打赌,您的Google搜索显示了如何执行此操作)。 关键是使用JPanel的paintComponent(...)方法重写中的Graphics对象的drawImage(...)方法进行绘制。

如果您愿意,如果您向我们提供有关当前代码和当前问题的更多详细信息,我们可能会为您提供更好,更具体的建议。

编辑
关于您发布的代码:首先,不要读入paintComponent(...)方法内的文件。 这会减慢GUI的绘制速度,并使GUI的响应性很差。 另外,为什么每次重画时都会在同一图像文件中重新读取您的代码? 否,而是一次读取文件并将其保存在Image变量中。 也许您应该使用ImageIO.read(...)阅读它。

接下来,您仍然需要按照之前的建议将文件移动到jar文件中。

编辑2
例如,使用如下代码:

Penguin.java

package myPackage;

import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Penguin extends JPanel {
   private Image image;

   public Penguin(String imageResource) throws IOException {
      InputStream inStream = getClass().getResourceAsStream(imageResource);
      image = ImageIO.read(inStream);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      if (image != null) {
         g.drawImage(image, 0, 0, this);
      }
   }
}

PenguinApplet.java

package myPackage;

import java.awt.BorderLayout;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;

import javax.swing.*;

@SuppressWarnings("serial")
public class PenguinApplet extends JApplet {
   @Override
   public void init() {
      try {
         SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
               createAndShowGui();
            }
         });
      } catch (InterruptedException e) {
         e.printStackTrace();
      } catch (InvocationTargetException e) {
         e.printStackTrace();
      }
   }

   public void createAndShowGui() {
      String penguinImgResource = "images/MyImage.jpg";
      try {
         Penguin penguinPanel = new Penguin(penguinImgResource );
         getContentPane().add(penguinPanel, BorderLayout.CENTER);
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

您可以将图像放在图像包中,而不包含类文件:

在此处输入图片说明

这里的关键问题是图像相对于类文件存储在哪里? 在我的示例中,类文件保存在myPackage中,图像保存在myPackage / images中,因此相对路径就是图像。 因此,图像文件夹中的任何图像都必须使用此路径(此处为“ images / MyImage.jpg”)进行引用,并作为资源而非文件获得。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM