【问题标题】:JFrame Taking Weird BackgroundJFrame 采用奇怪的背景
【发布时间】:2013-07-04 14:22:52
【问题描述】:

我遵循了 Java Hub 上关于在 JFrame 上绘制图像的教程。一切都完美无缺,除了 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();
    }
}

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

}


没有抛出异常...

【问题讨论】:

  • 1.图片链接坏了。 2.我没听懂你的问题
  • 我刚刚修复了图片链接,对此感到抱歉...我只是不知道是什么导致了问题——图片会很有帮助。
  • 我认为您的应用程序在显示框架内容之前崩溃,代码会有所帮助。另外,我在您的 catch 块中看到 Logger.getLogger[...],将其替换为 e.printStackTrace() 并查看是否引发了一些异常。如果您看到一些异常,请用它更新您的问题
  • 我更改了 catch{...} 但没有抛出异常,我还添加了代码。

标签: java swing jframe bufferedimage translucency


【解决方案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() 方法设置框架可见之前

【讨论】:

  • 如果我删除它,它根本不会绘制图像。
  • @user2550807 因为你重写了paint方法而不调用它是super。也因为这不是将背景图像设置为框架的方法。查看我的更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
相关资源
最近更新 更多