2016-09-07 104 views
-2

即時嘗試插入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(); 
    } 

回答

2

爲了顯示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

我可以看到一些問題在這裏 1.假設你Game類擴展JFrame,你需要JPanel中添加到JFrameContentPane。使用方法中的一種或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

    0

    這裏有多種問題,但首先讓我來回答你的問題:

    您正在創建一個新的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(); 
    } 
    
    -2

    很容易穿的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