2013-07-04 97 views
0

我遵循了Java Hub中關於在JFrame上繪製圖像的教程。除了JFrame基本上都會對其背後的任何東西進行截圖之外,一切都可以完美運行;例如:Eclipse。然後它無緣無故地製作背景。JFrame以奇怪的背景

這就是我得到:

enter image description here 任何想法?

Main.java:

package Package; 

import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

import javax.swing.JFrame; 

public class Main extends JFrame { 

BufferedImage sprite; 

public Main(){ 
    setSize(800, 600); 
    setVisible(true); 
    setResizable(false); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setLocationRelativeTo(null);   
    init(); 
} 

private void init(){ 
    BufferedImageLoader loader = new BufferedImageLoader(); 
    BufferedImage spriteSheet = null; 
    try { 
     spriteSheet = loader.loadImage("sprites2.png"); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    SpriteSheet ss = new SpriteSheet(spriteSheet); 
    sprite = ss.grabSprite(0, 0, 20, 32); 
} 

@Override 
public void paint(Graphics g){ 
    g.drawImage(sprite, 100, 100, null); 
    repaint(); 
} 

public static void main(String[] args){ 
    Main main = new Main(); 
    } 
} 

SpriteSheet.java:

package Package; 

import java.awt.image.BufferedImage; 

public class SpriteSheet { 
public BufferedImage spriteSheet; 

public SpriteSheet(BufferedImage ss){ 
    this.spriteSheet = ss; 
} 

public BufferedImage grabSprite(int x, int y, int width, int height){ 
    BufferedImage sprite = spriteSheet.getSubimage(x, y, width, height); 
    return sprite; 
    } 

} 

BufferedImageLoader.java:

package Package; 

import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.URL; 

import javax.imageio.ImageIO; 

public class BufferedImageLoader { 

public BufferedImage loadImage(String pathRelativeToThis) throws IOException{ 
    URL url = this.getClass().getResource(pathRelativeToThis); 
    BufferedImage img = ImageIO.read(url); 
    return img; 
    } 

} 


無異常被拋出...

+0

1.圖片鏈接被破壞。 2.我不明白你的問題 – BackSlash

+0

我只是修復了圖像鏈接抱歉...我只是不知道是什麼導致了這個問題 - 圖像會有幫助。 – user2550807

+0

我認爲你的應用在顯示幀內容之前崩潰,代碼會有幫助。另外,我在你的catch塊中看到'Logger.getLogger [...]',用'e.printStackTrace()'取代它,看看是否有一個異常被拋出。如果你看到一些例外,用它更新你的問題 – BackSlash

回答

1

由於paint()方法中的repaint()調用,您的應用程序掛起。這是一個遞歸調用,因爲repaint()調用paint()

您需要將其刪除,並且您的應用程序不會再掛起。


如果你只是刪除從 paint()方法 repaint()通話時,您的圖形將不會被繪製,因爲你沒有覆蓋父類的一個方法 paint()。它應該是這樣的:

@Override 
public void paint(Graphics g){ 
    super.paint(g); 
    g.drawImage(sprite, 100, 100, null); 
} 

但是,它不會顯示圖像,因爲你設置它可見後調用init()方法。在設置框架可見之前調用它,它將起作用。

然而,這不是把一個背景圖像中的JFrame正確的方法,你應該使用一個JPanel代替:

class ImagePanel extends JPanel { 
    private Image image; 
    int x, y; 
    public ImagePanel(Image image, int x, int y) { 
     this.image = image; 
     this.x = x; 
     this.y = y; 
    } 
    @Override 
    protected void paintComponent(Graphics g) { 
     g.drawImage(image, x, y, null); 
    } 
} 

要叫它:

SpriteSheet ss = new SpriteSheet(spriteSheet); 
sprite = ss.grabSprite(0, 0, 20, 32); 
ImagePanel backgroundImagePanel = new ImagePanel(sprite, 100, 100); 
setContentPane(backgroundImagePanel); 

另外,取出paint()覆蓋JFrame,並調用init()方法之前設置框架可見

+0

如果我刪除它,它根本不繪製圖像。 – user2550807

+0

@ user2550807因爲您重寫paint方法而不調用超級方法。還因爲這不是將背景圖像設置爲幀的方式。查看我的更新 – BackSlash