关于实现头像跳动的问题!!!???? 错误就是NullPointer....没有了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你要看一看image对象创建了没有,也就是说存不存在"face/face1.gif"文件,不过我没试! 这个是文件是存在的不过对于image对象的创建还是有点疑虑,,,不知道是不是这样创建??能不能说一下?? 通常是用这个 Toolkit.getDefaultToolkit().createImage(src); 我用的是Toolkit.getDefaultToolkit().getImage(src);有什么区别么?例子中写错了getImage()和createImage()方法的区别能说说么? 倒数第4行: Thread.sleep(500); 改成 Thread.currentThread().sleep(500)试试如果还出同样的错,可能在JForm.show()调用以前,getGraphics()返回null。//我也没调试你贴上来的程序。只是猜测。 更正:我把JFrame写成JForm了 以下是我基于你的代码稍加修改的结果,在我这里可以实现图像的跳动。import javax.swing.*;import java.awt.*;import java.awt.event.*;public class Demo extends JFrame{ private JumpGra jg; public Demo(){ jg=new JumpGra(); getContentPane().add(jg); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); setSize(200,200); show(); jg.start(); } public static void main(String[] args){ JFrame j=new Demo(); }} class JumpGra extends JLabel implements Runnable{ private Image image; private int x=40,y=40; private boolean b=true; Thread t; public JumpGra(){ image=new ImageIcon("images/1.gif").getImage(); t=new Thread(this); } public void paint(Graphics g){ if (image!=null) { g.drawImage( image,x,y,this); } } public void jump(){ if (b) { if (x==40) { x=42; y=42; } else { x=40; y=40; } }} public void start(){ t.start(); } public void run() { while(true){ try{ jump(); repaint(); t.sleep(200); }catch(Exception e){} } }}如果你想要实现你的跳动上的细节上的感觉可以修改jump方法。 import javax.swing.*;import java.awt.event.*;import java.awt.*;public class Demo extends JFrame{ private JPanel jPanel; private JumpGra jg; public Demo(){ jPanel=new JPanel(); jg=new JumpGra(jPanel); getContentPane().setLayout(null); getContentPane().add(jPanel); jPanel.setBounds (50,50,40,40); jg.jump(); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); setSize(200,200); } public static void main(String[] args){ JFrame j=new Demo(); j.show(); } }class JumpGra{ private JPanel jPanel; public Image image; public int x=0,y=5,dx=1,dy=1; public boolean b=true; public JumpGra(JPanel j){ jPanel=j; image=Toolkit.getDefaultToolkit().getImage("face/face1.gif"); } public void draw(){ Graphics g=jPanel.getGraphics(); g.drawImage( image,x,y,32,32,null); g.dispose(); } public void move(){ Graphics g=jPanel.getGraphics(); g.drawImage(image,x,y,32,32,null); if(b){ if(x<5){ x+=dx; y-=dy; } else if(x<10&&x>4){ x+=dx; y+=dy; if(x==10){b=false;} } } else{ if(x<5){ x-=dx; y+=dy; if(x==0){b=true;} } else if(x<10&&x>4){ x-=dx; y-=dy; } } g.drawImage(image,x,y,32,32,null); g.dispose(); } public void jump(){ draw(); while(true){ move(); try{ Thread.currentThread().sleep(500); }catch(Exception e){} } }}修改这个程序。。前面那个有些编译方面的错误这一个没有运动三角的三个点坐标为(0,5)(5,0)(10,5)编译通过运行错误如下:Exception in thread "main" java.lang.NullPointerException at JumpGra.draw(Demo.java:41) at JumpGra.jump(Demo.java:74) at Demo.(init)<Demo.java:15) at Demo.main(Demo.java:26)哪位高人能指点一二,多谢 cherami(cherami):有一点奇怪为什么要在JumpGra类里面重载start()方法是不是不必好像t是多余的?直接在try里面用sleep(200)就可以了吧? 这个程序改得匆忙,有很多问题。在JumpGra类里面重载start()方法主要是为了给JFrame提供一个启动接口。加入线程t的原因是一般都是这样构造的,将一个Runnalbe对象作为Thread的构造方法的参数。如果直接使用sleep而不实现Runnable的话我担心sleep的是整个程序而不是该组件,因为从你的程序来看只有一个线程在运行。 你的程序的问题出在draw和jump方法中的Graphics g=jPanel.getGraphics();得到的是一个空对象。也就是说g为null. 正则表达式--possessive问题 编译时函数cannot be resolved Java多线程程序设计详细解析 Java学习中的问题 求三重for循环的总共循环次数,代码如下: 小虾米求救,鼠标事件 请教关于Java入门的一些书籍或者电子书籍,不胜感激! 有关JAVA对象序列化时的几个概念问题,请高手老师指教 在JB8中使用JSPLITPANE的布局问题 如何得到 如何在 Applet 中调用浏览器显示特定页面?(空) main()方法的疑问?
不过对于image对象的创建还是有点疑虑,,,不知道是不是这样创建??
能不能说一下??
有什么区别么?
例子中写错了
getImage()和createImage()方法的区别能说说么?
//我也没调试你贴上来的程序。只是猜测。
我把JFrame写成JForm了
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Demo extends JFrame{
private JumpGra jg;
public Demo(){
jg=new JumpGra();
getContentPane().add(jg);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
setSize(200,200);
show();
jg.start();
}
public static void main(String[] args){
JFrame j=new Demo();
}
} class JumpGra extends JLabel implements Runnable{
private Image image;
private int x=40,y=40;
private boolean b=true;
Thread t;
public JumpGra(){
image=new ImageIcon("images/1.gif").getImage();
t=new Thread(this);
}
public void paint(Graphics g){
if (image!=null) {
g.drawImage( image,x,y,this);
}
}
public void jump(){
if (b) {
if (x==40) {
x=42;
y=42;
}
else
{
x=40;
y=40;
}
}
}
public void start(){
t.start();
} public void run() {
while(true){
try{
jump();
repaint();
t.sleep(200);
}catch(Exception e){}
} }
}
如果你想要实现你的跳动上的细节上的感觉可以修改jump方法。
import java.awt.event.*;
import java.awt.*;public class Demo extends JFrame{
private JPanel jPanel;
private JumpGra jg;
public Demo(){
jPanel=new JPanel();
jg=new JumpGra(jPanel); getContentPane().setLayout(null);
getContentPane().add(jPanel);
jPanel.setBounds (50,50,40,40);
jg.jump();
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
setSize(200,200);
}
public static void main(String[] args){
JFrame j=new Demo();
j.show();
}
}
class JumpGra{
private JPanel jPanel;
public Image image;
public int x=0,y=5,dx=1,dy=1;
public boolean b=true;
public JumpGra(JPanel j){
jPanel=j;
image=Toolkit.getDefaultToolkit().getImage("face/face1.gif");
}
public void draw(){
Graphics g=jPanel.getGraphics();
g.drawImage( image,x,y,32,32,null);
g.dispose();
}
public void move(){
Graphics g=jPanel.getGraphics();
g.drawImage(image,x,y,32,32,null);
if(b){
if(x<5){
x+=dx;
y-=dy;
}
else if(x<10&&x>4){
x+=dx;
y+=dy;
if(x==10){b=false;}
}
}
else{
if(x<5){
x-=dx;
y+=dy;
if(x==0){b=true;}
}
else if(x<10&&x>4){
x-=dx;
y-=dy;
}
}
g.drawImage(image,x,y,32,32,null);
g.dispose();
}
public void jump(){
draw();
while(true){
move();
try{
Thread.currentThread().sleep(500);
}catch(Exception e){}
}
}
}
修改这个程序。。前面那个有些编译方面的错误
这一个没有
运动三角的三个点坐标为(0,5)(5,0)(10,5)编译通过运行错误如下:
Exception in thread "main" java.lang.NullPointerException
at JumpGra.draw(Demo.java:41)
at JumpGra.jump(Demo.java:74)
at Demo.(init)<Demo.java:15)
at Demo.main(Demo.java:26)
哪位高人能指点一二,多谢
有一点奇怪为什么要在JumpGra类里面重载start()方法
是不是不必
好像t是多余的?
直接在try里面用sleep(200)就可以了吧?
在JumpGra类里面重载start()方法主要是为了给JFrame提供一个启动接口。
加入线程t的原因是一般都是这样构造的,将一个Runnalbe对象作为Thread的构造方法的参数。
如果直接使用sleep而不实现Runnable的话我担心sleep的是整个程序而不是该组件,因为从你的程序来看只有一个线程在运行。