我正在制作视频游戏,我需要将图像添加到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 );
}
}
答案 0 :(得分:4)
您可以轻松移动JLabel,因此这仍然是一个可行的选项,并且有一些技巧可以让您这样做,包括使用JLayeredPane或玻璃窗格。但话说回来,仍然不难在JPanel中绘制图像(我敢打赌你的谷歌搜索已经告诉你如何做到这一点)。关键是在JPanel的drawImage(...)
方法覆盖中使用Graphics'对象的paintComponent(...)
方法绘制它。
如果您愿意,如果您向我们提供有关您当前代码和当前问题的更多详细信息,我们可能会为您提供更好,更具体的建议。
修改强>:
关于您发布的代码:首先,不要在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”,并作为资源而非文件获取。