0

我遵循了 Java Hub 上关于在 JFrame 上绘制图像的教程。一切都完美无缺,除了 JFrame 基本上会截取其背后的任何内容;例如:日食。然后它无缘无故地成为背景。

这就是我得到的:

在此处输入图像描述 有任何想法吗?

主.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;
    }

}


没有异常被抛出...

4

1 回答 1

1

repaint()由于方法中的调用,您的应用程序挂起paint()。这是一个递归调用,如repaint()调用paint()

您需要删除它,您的应用程序将不再挂起。


如果您只是repaint()从方法中删除调用paint(),您的图形将不会被绘制,因为您在paint()不调用超类的情况下覆盖了该方法。它应该是这样的:

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

但是,它不会显示图像,因为您init()在将其设置为可见后调用该方法。在设置框架可见之前调用它,它将起作用。

但是,这不是将背景图像放入 的正确方法JFrame,您应该使用 aJPanel代替:

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()覆盖JFrameinit()

于 2013-07-04T14:40:27.057 回答