【问题标题】:Why does my java applet work with some images and not others?为什么我的 java 小程序适用于某些图像而不适用于其他图像?
【发布时间】: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 方法。为什么你认为你需要?

标签: java image applet awt


【解决方案1】:

这不是答案,我很快就需要删除它:我可以使用下面的源代码直接从 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);
    }
}

【讨论】:

    猜你喜欢
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 2019-03-11
    相关资源
    最近更新 更多