【发布时间】:2014-04-20 20:30:08
【问题描述】:
我有一个小程序,我正在尝试在其中绘制图像。如果我将图像文件设置为两个测试文件之一,图像会正确显示。但是,它不会绘制任何由 rotsprite 生成的图像。起初我以为这是一个文件类型问题,因为原来的两个是 .png 而 rotsprite 输出是 .bmp,但是当我使用 GIMP 将位图导出为 png 时,我得到了相同的结果。我没有收到任何错误或控制台消息,只是图像不会绘制。
这些循环在我的init() 方法中,用于为我的火箭初始化一个精灵数组列表。
for (int i = 1; i < 10; i++) {
Image temp = getImage(base, "./data/rahkeht_sprite_0" + i + ".png");
rahkehtImage.add(temp);
}
for (int i = 10; i < 37; i++) {
Image temp = getImage(base, "./data/rahkeht_sprite_" + i + ".png");
rahkehtImage.add(temp);
}
这些是我的 update() 和 paint() 方法。
public void update(Graphics g) {
if (image == null) {
image = createImage(this.getWidth(), this.getHeight());
second = image.getGraphics();
}
second.setColor(getBackground());
second.fillRect(0, 0, getWidth(), getHeight());
second.setColor(getForeground());
paint(second);
g.drawImage(image, 0, 0, this);
}
public void paint(Graphics g) {
g.drawImage(rahkehtImage.get(rahkeht.getAngle()), 0, 0, this);
}
我知道路径和文件名是正确的,因为我已经在我的图像列表中使用了一个手表,并且,就像我之前所说的,我可以让它在同一目录中加载另外两个测试图像。
下面是展示问题的完整类。我已经包含了一个图像的示例,该示例可以与上面的图像一样有效。
package Main;
import java.applet.Applet;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.net.URL;
public class StartingClass extends Applet implements Runnable{
private Image image, temp, temp2;
private Graphics second;
private URL base;
@Override
public void run() {
// TODO Auto-generated method stub
while (true){
repaint();
try{
Thread.sleep(17);
} catch (InterruptedException e){
e.printStackTrace();
}
}
}
public void init(){
setSize(480,800);
setBackground(Color.BLACK);
setFocusable(true);
Frame frame = (Frame)this.getParent().getParent();
frame.setTitle("StackOverflow Code");
try{
base = getDocumentBase();
} catch (Exception e) {
}
//won't draw converted png
temp = getImage(base, "./data/rahkeht_sprite_01.png");
//will draw this one
temp2 = getImage(base, "./data/character.png");
}
public void start() {
Thread thread = new Thread(this);
thread.start();
}
public void update(Graphics g){
if (image == null) {
image = createImage(this.getWidth(), this.getHeight());
second = image.getGraphics();
}
second.setColor(getBackground());
second.fillRect(0, 0, getWidth(), getHeight());
second.setColor(getForeground());
paint(second);
g.drawImage(image, 0, 0, this);
}
public void paint(Graphics g){
g.drawImage(temp, 1, 1, this); //won't draw
g.drawImage(temp2, 300, 300, this); //will draw
}
}
覆盖更新方法并没有破坏绘图,但http://journals.ecs.soton.ac.uk/java/tutorial/ui/drawing/update.html 很好地解释了我为什么要覆盖更新方法。
【问题讨论】:
-
你试过用JPG而不是PNG吗?
-
不,我没有尝试过 jpgs
-
你能在问题中嵌入这些问题 PNG 之一吗?请注意,PNG 是 AFAIR,一种容器格式。这意味着它可能会使用多种不同的格式进行编码。
-
1) 为了尽快获得更好的帮助,请发布MCTaRE(最小的完整测试和可读示例)。 2) 这是使用 Swing 还是 AWT? 3) 为什么要编写小程序?如果是由于规范。老师请发给Why CS teachers should stop teaching Java applets。
-
public void update(Graphics g) {..在 10 多年的 Java 编码中,包括许多自定义绘画示例,我从来没有需要重写update方法。为什么你认为你需要?