0

JFrame での画像の描画に関する Java Hub のチュートリアルに従いました。JFrameが基本的にその背後にあるもののスクリーンショットを撮ることを除いて、すべてが完全に機能します。例:エクリプス。次に、理由もなくそれを背景にします。

これは私が得るものです:

ここに画像の説明を入力 何か案は?

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();
    }
}

スプライトシート.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()可視に設定した後にメソッドを呼び出すため、画像は表示されません。フレームを可視に設定する前に呼び出すと、機能します。

ただし、これは に背景画像を配置する正しい方法ではありません。代わりにJFramea を使用する必要があります。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()

于 2013-07-04T14:40:27.057 に答える