gpt4 book ai didi

Java IO 无法读取输入文件?

转载 作者:行者123 更新时间:2023-12-01 17:28:19 24 4
gpt4 key购买 nike

我刚刚开始学习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 Paint制作的,如果有帮助的话。

谢谢。

最佳答案

一个简单的沙盒小程序可以从两个地方获取图像。

哪里

  1. 提供小程序的同一服务器上的松散文件。例如。这可能用于沙盒“图像幻灯片”,其中图像名称在小程序参数中提供。
  2. 小程序运行时类路径上的 Jar。最适合通常不会更改的资源(本地化图像除外,因为本地化图像会变得更加复杂)。例如。这可能用于按钮/菜单图标或 BG 图像。

"background.png" 强烈指示第二个场景 - “应用程序的一部分”。本身”。

如何查找

两种类型的资源都应该由URL标识(不要尝试建立文件,因为在部署小程序时它会失败) .

获取第二种情况的 URL 的方法类似于:

URL urlToBG = this.getClass().getResource("/path/to/the/background.png");

..其中/path/to/the/可能只是/resources//images/。它是类路径上 Jar 内的路径,可以在其中找到图像。

如何加载

大多数加载文件的方法都会被重载以接受URL。这尤其适用于ImageIO.read(URL)

虽然 Applet 类具有加载图像的内置方法,但我建议坚持使用 ImageIO,因为它提供了更全面的失败反馈。

更多提示

提示 1

Thread.sleep(20);

不要阻塞 EDT(事件调度线程)——发生这种情况时 GUI 将“卡住”。不是调用 Thread.sleep(n) 而是实现 Swing Timer 来重复任务或使用 SwingWorker 来长时间运行任务。请参阅Concurrency in Swing更多细节。

提示 2

现在是第三个千年了,是时候开始使用 Swing 而不是 AWT 了。这意味着扩展 JApplet 而不是 Applet。然后,您可以将绘画逻辑转移到默认情况下双缓冲的 JPanel 中,并且可以在小程序或框架(或窗口或对话框......)中使用。

提示 3

setSize(864,480);

小程序的大小是在 HTML 中设置的,小程序应该接受分配给它的任何大小并在该大小内工作。考虑到这一点,声明如下:

d.clearRect(0, 0, 864, 480);

..应该读得更像:

d.clearRect(0, 0, getWidth(), getHeight());

关于Java IO 无法读取输入文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13318912/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com