Java 图形绘制图像渲染奇怪的方块
所以我在用Java制作自己的游戏,是的,很奇怪。问题是,我提出了一种方法,返回一个加载了图像的BuffereImage:Java 图形绘制图像渲染奇怪的方块,java,awt,2d,Java,Awt,2d,所以我在用Java制作自己的游戏,是的,很奇怪。问题是,我提出了一种方法,返回一个加载了图像的BuffereImage: public static BufferedImage getImage(String img) { try { image = ImageIO.read(Game.class.getResourceAsStream("./img/" + img)); } catch (IOException e) { e.printS
public static BufferedImage getImage(String img) {
try {
image = ImageIO.read(Game.class.getResourceAsStream("./img/" + img));
} catch (IOException e) {
e.printStackTrace();
}
image.flush();
return image;
}
此方法返回“我的图标”的图像,没有问题
frame.setIconImage(Game.getImage("icon.png"));
问题是当我在画布上绘制图像时:
g.drawImage(Game.getImage("aa.png"), 0, 0,Game.WIDTH, Game.HEIGHT,null);
显示以下内容:
实际图像是:
有人能帮我吗
我应该说它可以在Windows上运行,但不能在GNU/Linux上运行。拍摄您的图像,并将其放在这个类下面的子目录/包中(在
img
包中),这对我来说很好
我注意到了什么aa
在我下载时是一个jpg
,但在您的代码中被命名为png
,可能不是问题,但是不同的
如果没有a,几乎不可能知道还有什么建议我最终发现这是一个硬件问题。我回到家,在同一硬盘上的VM+上测试了它。它工作正常,很抱歉占用您的时间回答。可能不想从
“刷新此图像对象正在使用的所有可重构资源。这包括缓存以渲染到屏幕的任何像素数据,以及用于存储图像数据或像素(如果可以重新创建)的任何系统资源“
这并不是说flush方法仍然不起作用。另外,getImage
方法似乎在实例字段中缓存对图像的引用-您不应该这样做,您应该只返回结果图像-并且可能引发异常,因为它不是真正的方法来处理固定的责任,我仍然有相同的错误。我真的不知道该怎么办,应该说它可以在Windows上运行,但不能在Linux上运行OpenGL你可以在那里查看源代码,有点混乱它在MacOSSo上运行良好。。。问题在于linux。。。我不知道这是否是我的发行版,我会稍后在虚拟机中试用,如果有效,我会更新。事实上,这可能与你如何管理缓冲策略有关
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new MenuPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public static class Game {
public static BufferedImage getImage(String named) throws IOException {
return ImageIO.read(Game.class.getResource("img/" + named));
}
}
public class MenuPane extends JPanel {
private BufferedImage background;
public MenuPane() {
try {
background = Game.getImage("aa.jpg");
} catch (IOException ex) {
ex.printStackTrace();
}
}
@Override
public Dimension getPreferredSize() {
return background == null ? new Dimension(200, 200) : new Dimension(background.getWidth(), background.getHeight());
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(background, 0, 0, this);
}
}
}