2013-07-04 78 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