我刚刚开始学习java,我一直在使用键盘输入来处理移动对象的代码。我现在正试图在后台添加,但它一直出错:
javax.imageio.IIOException: Can't read input file!
at javax.imageio.ImageIO.read(Unknown Source)
at game.GameLoop.run(GameLoop.java:24)
at java.lang.Thread.run(Unknown Source)
我在Game.java中的代码是:
package game;
import java.applet.*;
import java.awt.*;
public class Game extends GameLoop{
public void init(){
setSize(864,480);
Thread th = new Thread(this);
th.start();
offscreen = createImage(864,480);
d = offscreen.getGraphics();
addKeyListener(this);
}
public void paint(Graphics g){
d.clearRect(0, 0, 864, 480);
d.drawImage(background, 0, 0, this);
d.drawRect(x, y, 20, 20);
g.drawImage(offscreen, 0, 0, this);
}
public void update(Graphics g){
paint(g);
}
}
这是我的GameLoop.java:
package game;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class GameLoop extends Applet implements Runnable, KeyListener{
public int x, y;
public Image offscreen;
public Graphics d;
public boolean up, down, left, right;
public BufferedImage background;
public void run(){
x = 100;
y = 100;
try {
background = ImageIO.read(new File("background.png"));
} catch (IOException e1) {
e1.printStackTrace();
}
while(true){
x = 100;
y = 100;
while(true){
if (left == true){
x-=4;
}
if (right == true){
x+=4;
}
if (up == true){
y-=4;
}
if (down == true){
y+=4;
}
if ( x <= 0 ){
x = 0;
}
if ( y <= 0 ){
y = 0;
}
if ( x >= 843 ){
x = 843;
}
if ( y >= 460 ){
y = 459;
}
repaint();
try{
Thread.sleep(20);
} catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
//@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == 37){
left = true;
}
if(e.getKeyCode() == 38){
up = true;
}
if(e.getKeyCode() == 39){
right = true;
}
if(e.getKeyCode() == 40){
down = true;
}
}
//@Override
public void keyReleased(KeyEvent e) {
if(e.getKeyCode() == 37){
left = false;
}
if(e.getKeyCode() == 38){
up = false;
}
if(e.getKeyCode() == 39){
right = false;
}
if(e.getKeyCode() == 40){
down = false;
}
}
//@Override
public void keyTyped(KeyEvent e) {
}
}
很抱歉编辑我似乎无法在``中得到所有内容,而且我也会修复凌乱的代码,但是你们有任何想法是什么导致了这个错误,有一个文件在src目录叫做background.png,它非常基本,用MS绘制,如果有帮助的话。
感谢。
答案 0 :(得分:4)
有两个地方,一个简单的沙盒小程序可以获取图像。
"background.png"
强烈表明第二种情况 - '应用程序的一部分。本身”。
这两种类型的资源都应由URL
标识(不要尝试建立File
,因为在部署applet时它会失败。)
获得第二种情况的URL
的方法类似于:
URL urlToBG = this.getClass().getResource("/path/to/the/background.png");
..其中/path/to/the/
可能只是/resources/
或/images/
。它是类路径中Jar的路径,可以在其中找到图像。
大多数加载File
的方法都会重载以接受URL
。这特别适用于ImageIO.read(URL)
。
虽然Applet
类具有内置方法来加载图像,但我建议坚持使用ImageIO
,因为它可以提供更全面的故障反馈。
Thread.sleep(20);
不要阻止EDT(事件调度线程) - 当发生这种情况时,GUI将“冻结”。而不是调用Thread.sleep(n)
为重复任务实现Swing Timer
或为长时间运行的任务实现SwingWorker
。有关详细信息,请参阅Concurrency in Swing。
这是第三个千年,是时候开始使用Swing而不是AWT了。这意味着延长JApplet
而不是Applet
。然后你可以将绘画的逻辑转换为默认为双缓冲的JPanel
,并且可以在applet或框架(或窗口或对话框......)中使用。
setSize(864,480);
applet的大小是用HTML设置的,applet应该接受分配的大小并在其中工作。考虑到这一点,声明如下:
d.clearRect(0, 0, 864, 480);
..应该更像是:
d.clearRect(0, 0, getWidth(), getHeight());
答案 1 :(得分:1)
@Patricia Shanahan您的评论实际上帮助我解决了同样的问题。
我用过那段代码:
File here = new File(".");
try {
System.out.println(here.getCanonicalPath());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
从那里你可以找出正确的使用路径。