2

我正在制作一个视频游戏,我需要将图像添加到 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 );
    }
}
4

1 回答 1

4

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

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

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

接下来,您仍然需要按照之前向您推荐的方式将该文件移动到 jar 文件中。

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

企鹅.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);
      }
   }
}

企鹅Applet.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”,并作为资源而不是文件获取。

于 2012-06-29T21:08:56.407 回答