作为背景的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中添加到JFrameContentPane。使用方法中的一种或setContentPane(backgroundPanel);getContentPane().add(backgroundPanel)

  1. 您没有使用LayoutManager。因此,要么使用LayoutManager,要么使用setBounds()方法明确设置“JFrame”和“JPanel”的大小。我会建议使用LayoutManager

  2. JPanel或任何Component不会自动刷新自己。一旦你改变了图像,你需要在你的JPanel上调用repaint()

  3. 每次更改图像时都不需要创建新的JPanel。只需扩展JPanel并像您所做的那样覆盖paintComponent()即可。使用Timer更改该单个实例的图像,并在每次更改时调用repaint()

  4. 完整的例子,你看到的帽子输出将有助于更好地理解问题并给你一个解决方案。请参阅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); 
+1

您的问题是“以JPanel为背景的绘图图像”,这并不回答原来的问题 - 它回答了你脑海中的问题 – gpasch