我有一个小程序,我正在尝试在其中绘制图像。如果我将图像文件设置为两个测试文件之一,图像将正确显示。但是,它不会绘制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>
以下是展示问题的完整课程。我已经包含了一个图像的示例,它可以像上面没有的图像一样工作。
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提供了一个很好的解释,说明我为什么要覆盖更新方法。
答案 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);
}
}