gpt4 book ai didi

java - 我无法在 JPanel 上查看 BufferedImage 图像

转载 作者:太空宇宙 更新时间:2023-11-04 06:54:18 25 4
gpt4 key购买 nike

我在使用下面的代码时遇到问题。如果我将图像直接加载到 JPanel 中,我就可以看到它。但是,当我尝试在 JPanel 上绘制 BufferedImage 之前先将其绘制到 BufferedImage 时,图像不可见。我做错了什么?

import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import java.awt.*;
import javax.swing.JPanel;

/**
*
* @author Duafeb
*/
public class RTester {
BufferedImage backBuffer;
Graphics2D g2;
Pane pain;
Image img;




public RTester(){
JFrame frame=new JFrame("Sprite Tester");
frame.setSize(1200, 700);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
backBuffer= new BufferedImage(1200,700,BufferedImage.TYPE_INT_RGB);
g2=backBuffer.createGraphics();
pain=new Pane();
frame.add(pain);
Toolkit tk=Toolkit.getDefaultToolkit();
img=tk.getImage(this.getClass().getResource("running.png"));


frame.setVisible(true);
}
public class Pane extends JPanel{
@Override
public void paintComponent(Graphics g){
Graphics2D g3=(Graphics2D)g;
g3.drawImage(backBuffer, 0, 0, this);

}
}

public void display(){
g2.setColor(Color.yellow);
g2.fillRect(0, 0, pain.getWidth(), pain.getHeight());
g2.drawImage(img, 0, 0, pain);
pain.repaint();
}
public static void main(String[] args){
RTester test=new RTester();
test.display();
}

}

最佳答案

有一些事情感觉不太对劲......

第一个是,您为 BufferedImage 创建一个 Graphics 上下文,但永远不会处置它。请注意,在某些系统上,这可能会阻止内容渲染,但这可能与屏幕设备有关,而不是 BufferedImage

例如,如果我更改代码以直接在 paintComponent 方法中绘制内容,而不是在 BufferedImage 中绘制内容,则将显示图像(在窗口可见后的一瞬间)。

我不确定您想通过使用 BufferedImage 实现什么目的,但您可以直接通过 paintComponent 方法实现相同的目的

您可以使用 ImageIO.read 而不是使用 Toolkit.getImage,它保证在返回时图像已完全加载(或者如果失败,将抛出 IOException),或者如 @Reimeus 之前建议的那样,使用 MediaTracker 确保图像在继续使用之前已正确加载。

所以,你有四个选择......

一个

使用MediaTracker等待图像加载...

MediaTracker mt = new MediaTracker(frame);
mt.addImage(img, 1);
try {
mt.waitForAll();
} catch (InterruptedException ex) {
ex.printStackTrace();
}

两个

使用ImageIO.read代替...

img = ImageIO.read(this.getClass().getResource("running.png"));

直接在 paintComponent 方法中渲染输出...

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g3 = (Graphics2D) g;
g3.setColor(Color.yellow);
g3.fillRect(0, 0, pain.getWidth(), pain.getHeight());
g3.drawImage(img, 0, 0, obsever);
}

使用您自己的ImageObserver来确保当图像更新时,您将其重新渲染到后备缓冲区...

private MyImageObsever obsever;

public void display() {
if (obsever == null) {
obsever = new MyImageObsever(this);
}
g2.setColor(Color.yellow);
g2.fillRect(0, 0, pain.getWidth(), pain.getHeight());
g2.drawImage(img, 0, 0, obsever);
pain.repaint();
}

public class MyImageObsever implements ImageObserver {

private RTester tester;

public MyImageObsever(RTester tester) {
this.tester = tester;
}

@Override
public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) {
tester.display();
return (infoflags & (ALLBITS|ABORT)) == 0;
}

}

关于java - 我无法在 JPanel 上查看 BufferedImage 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22949664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com