Java Applet中cup.gif图片无法加载问题求助
解决Java Applet图片无法显示的问题
我来帮你排查一下图片不显示的问题,从代码和运行环境来看,主要有这几个核心原因,咱们一步步来修复:
1. 图片加载路径的问题
你当前用getDocumentBase()获取图片路径,这个方法返回的是HTML文件所在的URL。如果是直接双击打开C盘的HTML文件(比如file:///C:/xxx.html),虽然理论上路径是对的,但本地文件协议下的路径解析偶尔会出问题。更稳妥的方式是用getCodeBase()——它返回的是Applet类文件所在的URL,刚好你的图片和class文件在同一目录,修改代码如下:
cup = getImage(getCodeBase(), "cup.gif");
2. Canvas组件挡住了Applet的绘图区域
你把myCanvas添加到了BorderLayout.NORTH,而Applet自身的paint方法是在Applet的根容器绘图,但Canvas会占据NORTH区域直接覆盖掉Applet的绘图空间,导致图片被彻底挡住。解决办法是把绘图逻辑移到Canvas内部:
// 替换原来的Canvas定义,改成自定义Canvas并重写paint方法 Canvas myCanvas = new Canvas() { @Override public void paint(Graphics g) { super.paint(g); // 先清除画布原有内容 g.drawImage(cup, left, top, this); } };
同时删除Applet类里的paint方法,这样图片就会直接画在Canvas上,不会被遮挡。
3. 图片异步加载导致的未就绪问题
Applet加载图片是异步操作,可能在paint调用时图片还没加载完成,所以需要用MediaTracker等待图片加载完毕:
在init方法里添加这段代码:
MediaTracker tracker = new MediaTracker(this); tracker.addImage(cup, 0); try { tracker.waitForAll(); } catch (InterruptedException e) { e.printStackTrace(); }
这段代码会阻塞到图片加载完成后再继续初始化,避免绘图时图片还没准备好。
4. 顺便修复两个影响功能的小错误
- 字符串比较别用
==,要用equals():==比较的是对象引用,不是字符串内容,虽然偶尔能生效,但属于不良习惯; actionPerformed里把Right拼写成了Rigth,而且对应的变量写错成了top,应该是left+=15。
完整修改后的代码示例
import java.awt.*; import java.applet.*; import java.awt.event.*; public class MoveIt extends Applet implements ActionListener { private Image cup; public Panel keyPad; public int top = 15; public int left = 15; private Button keysArray[]; private Canvas myCanvas; // 设为成员变量,方便调用repaint public void init() { // 使用类文件所在路径加载图片 cup = getImage(getCodeBase(), "cup.gif"); // 等待图片加载完成 MediaTracker tracker = new MediaTracker(this); tracker.addImage(cup, 0); try { tracker.waitForAll(); } catch (InterruptedException e) { e.printStackTrace(); } // 自定义Canvas负责绘图 myCanvas = new Canvas() { @Override public void paint(Graphics g) { super.paint(g); g.drawImage(cup, left, top, this); } }; setBackground(Color.blue); keyPad = new Panel(); // 初始化按钮数组 keysArray = new Button[5]; keysArray[0] = new Button("Up"); keysArray[1] = new Button("Down"); keysArray[2] = new Button("Right"); keysArray[3] = new Button("Left"); keysArray[4] = new Button("Center"); // 设置布局 setLayout(new BorderLayout()); keyPad.setLayout(new BorderLayout()); // 组装按钮面板 keyPad.add(keysArray[0], BorderLayout.NORTH); keyPad.add(keysArray[1], BorderLayout.SOUTH); keyPad.add(keysArray[2], BorderLayout.EAST); keyPad.add(keysArray[3], BorderLayout.WEST); keyPad.add(keysArray[4], BorderLayout.CENTER); // 添加组件到Applet add(keyPad, BorderLayout.SOUTH); add(myCanvas, BorderLayout.CENTER); // 绑定事件监听器 for(int i=0; i<5; i++) { keysArray[i].addActionListener(this); } } public void actionPerformed(ActionEvent e) { String arg = e.getActionCommand(); if(arg.equals("Up")) { top-=15; } if(arg.equals("Down")) { top+=15; } if(arg.equals("Left")) { left-=15; } if(arg.equals("Right")) { left+=15; } if(arg.equals("Center")) { top=60; left=125; } myCanvas.repaint(); // 重绘Canvas区域 } }
按照上面的修改后,你的图片应该就能正常显示,并且跟随按钮指令移动了。
内容的提问来源于stack exchange,提问作者yogi
相关产品推荐
相关产品推荐

