为什么我的java applet可以处理一些图像而不是其他图像?

时间:2014-03-15 12:28:21

标签: java image applet awt

我有一个小程序,我正在尝试在其中绘制图像。如果我将图像文件设置为两个测试文件之一,图像将正确显示。但是,它不会绘制rotsprite生成的任何图像。我一开始认为它是一个文件类型的问题,因为原来的两个是.png而rotsprite输出是.bmp,但是当我使用GIMP将位图导出到png时,我得到相同的结果。我没有收到任何错误或控制台消息,只是图像不会绘制。

这些循环在我的init()方法中为我的火箭初始化精灵的arraylist。

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

我知道路径和文件名是正确的,因为我已经在我的图像列表中使用了一个监视器,就像我之前说过的那样,我可以让它在同一目录中加载另外两个测试图像。 / p>

enter image description here

以下是展示问题的完整课程。我已经包含了一个图像的示例,它可以像上面没有的图像一样工作。

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提供了一个很好的解释,说明我为什么要覆盖更新方法。

1 个答案:

答案 0 :(得分:0)

这不是答案,我很快就会将其删除:我可以使用下面的来源直接从imgur.com成功加载该图片。这个来源对你有用吗?

import java.awt.*;
import java.net.*;
import javax.swing.*;
import javax.imageio.*;

class ImageTest {

    public static void main(String[] args) throws Exception {
        URL url = new URL("http://i.stack.imgur.com/yRSbY.png");
        final Image img = ImageIO.read(url);

        Runnable r = new Runnable() {

            @Override
            public void run() {
                JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(img)));
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency
        SwingUtilities.invokeLater(r);
    }
}