作为背景的JPanel上的图像
即时尝试插入gif作为我的应用程序的背景。我剪切了所有的帧并将它们重命名为f1/f2/f3/f4/f5/f6/.....我将使用计时器来更改帧,使其看起来像动画。作为背景的JPanel上的图像
总共有42帧,所以f42.png是最后一帧。代码似乎很好,但没有结果。任何帮助?
全局变量:
private String backgroundFile;
public JPanel backgroundPanel, areaImage;
private BufferedImage background;
private javax.swing.Timer timerBackground;
构造,其中定时器初始化:
public Game()
{
entryWindow();
this.setLayout(null);
timerBackground = new javax.swing.Timer(100,this);
timerBackground.stop();
}
动画方法代码:
private void backgroundAnimation()
{
backgroundFile = "f"+backgroundNum+".png";
try{
background=ImageIO.read(new File(backgroundFile));
}
catch(IOException e)
{
}
backgroundPanel = new JPanel()
{
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(background, 0, 0, 1100,800,null);
}
};
backgroundPanel.setBackground(Color.BLACK);
backgroundPanel.setBounds(0, 0, 1100, 800);
if (backgroundNum>42)backgroundNum++;
else backgroundNum=1;
add(backgroundPanel);
backgroundPanel.setVisible(true);
}
动作侦听器,定时器:
if (ae.getSource() == timerBackground)
{
backgroundAnimation();
}
为了显示JPanel,您需要将其添加到像带有BorderLayout的JFrame之类的东西,然后您需要显示JFrame。 JFrame是一个应用程序窗口,JPanel只能在Window上添加和绘制,如果没有它可以绘制的东西(比如应用程序窗口),它不能被查看。除此之外,你不需要每次创建新JPanel动画的变化,只是做一个二传手当前图像显示,并分配图像调用重绘()之后,ImagePanel
可能是这样的:
public class ImagePanel extends JPanel {
private volatile BufferedImage image;
public void showImage(BufferedImage image) {
this.image=image;
repaint();
}
public void paintComponent(Graphics g) {
g.drawImage(image, 0,0,getWidth(),getHeight(),null);
}
}
在应用程序启动时将它添加到您的JFrame中,同时最好还是将JFrame的LayoutManager设置为BorderLayout,因为如果没有设置它,面板的尺寸就会变大(0,0),这可能是原因之一你没有看到它(你不能看到大小为0像素的东西,对吗?)。
然后在您的计时器中,只需拨打ImagePanel
方法public void showImage(BufferedImage image)
即可显示图像。如果这不能解决您的问题,请发布您的整个代码。没有,我只是猜测,但这些都是常见的问题,所以有很大的机会,你从这个东西。
我可以看到一些问题在这里 1.假设你Game
类扩展JFrame
,你需要JPanel中添加到JFrame
的ContentPane
。使用方法中的一种或setContentPane(backgroundPanel);
getContentPane().add(backgroundPanel)
您没有使用
LayoutManager
。因此,要么使用LayoutManager
,要么使用setBounds()
方法明确设置“JFrame”和“JPanel”的大小。我会建议使用LayoutManager
。该
JPanel
或任何Component
不会自动刷新自己。一旦你改变了图像,你需要在你的JPanel上调用repaint()
。每次更改图像时都不需要创建新的
JPanel
。只需扩展JPanel
并像您所做的那样覆盖paintComponent()
即可。使用Timer
更改该单个实例的图像,并在每次更改时调用repaint()
。
完整的例子,你看到的帽子输出将有助于更好地理解问题并给你一个解决方案。请参阅How to create a Minimal, Complete, and Verifiable example
这里有多种问题,但首先让我来回答你的问题:
您正在创建一个新的JPanel
,并把它添加到Game
在每次运行时通过。这是错误的,因为你添加无限的面板到你的Game
也在你的if/else你有一个错误的条件。您增加迭代器时,它大于42.你可能意味着较少比42
这里是我会怎么做:
public class BackgroundPanel extends JPanel {
private int currImage = 0;
private BufferedImage[] backgroundImages;
public BackgroundPanel() {
int numberOfImages = 42;
backgroundImages = new BufferedImage[42];
for(int i = 1; i <= numberOfImages; i++) {
String backgroundFile = "f" + i + ".png";
backgroundImages[i] = ImageIO.read(new File(backgroundFile));
}
}
public void nextImage() {
/*if(currImage <= 42) currImage++;
else currImage = 1;*/
if(currImage++ > 42) currImage = 1;
repaint();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(backgroundImages[currImage], 0, 0, getWidth(), getHeight(), null);
}
}
您需要一次添加此面板为您的“游戏”:
//Somewhere in your Game
private BackgroundPanel backgroundPanel;
...
...
public Game() {
entryWindow();
this.setLayout(null);
backgroundPanel = new backgroundPanel();
backgroundPanel.setSize(getWidth(), getHeight());
add(backgroundPanel);
timerBackground = new javax.swing.Timer(100,this);
timerBackground.stop();
}
您的计时器:
if (ae.getSource() == timerBackground) {
backgroundPanel.nextImage();
}
很容易穿的JLabel的背景。它只需要3行代码并且工作正常! :)希望它有助于任何人会有同样的问题:)
所有你需要做的就是复制此代码,更改名称(我有一个名为“图像”文件夹中的所有图片)与任何种类的Java支持的图片/视频/ ....(只需将后缀.gif更改为您的文件格式),最后是大小。祝你好运! :)
public JLabel backgroundGIF;
backgroundGIF = new JLabel(new ImageIcon(getClass().getResource("Images/background.gif")));
backgroundGIF.setBounds(0,0,1100,800);
add(backgroundGIF);
您的问题是“以JPanel为背景的绘图图像”,这并不回答原来的问题 - 它回答了你脑海中的问题 – gpasch