import java.awt.*;
import java.awt.event.*;
import java.net.*;public class Ex18_1_db extends Frame{
int x=180,y=180;
Image buff,img;
public Ex18_1_db(String title){
super(title);
try{
Toolkit tk=getToolkit();
URL url=getClass().getResource("Red_Car.gif");
img=tk.getImage(url);
buff=createImage(33,49);
Graphics gg=buff.getGraphics();
gg.drawImage(img,0,0,this);
getGraphics().drawImage(buff,0,0,this);
}catch(Exception e){System.out.print("No");}
KeyListener dir=new KeyAdapter(){
public void keyPressed(KeyEvent e){
String s=e.getKeyText(e.getKeyCode());
if(s.equals("Right")){if(x<320)x+=10;else x+=0;}
else if(s.equals("Left")){if(x>0)x-=10;else x-=0;}
else if(s.equals("Up")){if(y>150)y-=10;else y-=0;}
else if(s.equals("Down")){if(y<320)y+=10;else y+=0;}
repaint();
}
};
addKeyListener(dir);
}
public static void main(String[] args){
Ex18_1_db ob=new Ex18_1_db("Ex18_1_db");
ob.setSize(360,360);
ob.setVisible(true);
}
}
这个程序老是出问题真不知道怎么解决了,请高手指点,先谢了。

解决方案 »

  1.   

    buff=createImage(33,49);
    这句buff拿到的是null,原因么,上班时间哦调了1个小时也没调出来,日
      

  2.   

    createImage
    public Image createImage(int width,
                             int height)
    Creates an off-screen drawable image to be used for double buffering. Parameters:
    width - the specified width
    height - the specified height 
    Returns:
    an off-screen drawable image, which can be used for double buffering. The return value may be null if the component is not displayable. This will always happen if GraphicsEnvironment.isHeadless() returns true.
    Since: 
    JDK1.0 
    See Also:
    isDisplayable(), GraphicsEnvironment.isHeadless()
      

  3.   

    你有没有把applet篡改成frame的了
      

  4.   

    没有篡改```我是为了在消除闪烁才用一下双缓冲的,但是老尝试不出来急得我要死,先前不用双缓冲的我以前弄出来了,现在就差这个了。先前的代码为:import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.*;
    import java.awt.image.*;
    import java.net.*;public class Ex18_1 extends Frame{
    Toolkit tk;
    Image img;
    int x=180,y=180;
    public Ex18_1(String title){
    super(title);
    tk=getToolkit();
    Class cl=getClass();
    img=tk.getImage(cl.getResource("Red_Car.gif"));
    KeyListener dir=new KeyAdapter(){
    public void keyPressed(KeyEvent e){
    String s=e.getKeyText(e.getKeyCode());
    if(s.equals("Right")){if(x<320)x+=10;else x+=0;}
    else if(s.equals("Left")){if(x>0)x-=10;else x-=0;}
    else if(s.equals("Up")){if(y>150)y-=10;else y-=0;}
    else if(s.equals("Down")){if(y<320)y+=10;else y+=0;}
    repaint();
    }
    };
    addKeyListener(dir);
    }
    public void paint(Graphics g){
       Graphics2D g2=(Graphics2D)g;
       g2.translate(x,y);
           g2.drawImage(img,-1,-1, this);
    }
    public static void main(String[] args){
    Ex18_1 ob=new Ex18_1("Ex18_1");
    ob.setSize(360,360);
    ob.setVisible(true);
    }
    }我没用APPLET的
      

  5.   

    大哥,你的这些操作过程要放到paint方法中才行!构造函数中Frame的peer还没有addNotify呢,没有对等体,当然不能行了!
      

  6.   

    谁可以帮我改一下``谢谢了``我学JAVA才一个月``请高手指教
      

  7.   

    这是我改过后的代码但是我还是觉得没有实现双缓冲````请高手指教``先谢谢了
    import java.awt.*;
    import java.awt.event.*;
    import java.net.*;
    import java.awt.image.*;public class Ex18_1_db extends Frame{
    int x=180,y=180;
    Image buffer;
    Image img;
    Toolkit tk;
    public Ex18_1_db(String title){
    super(title);

    KeyListener dir=new KeyAdapter(){
    public void keyPressed(KeyEvent e){
    String s=e.getKeyText(e.getKeyCode());
        if(s.equals("Right")){if(x<320)x+=10;else x+=0;}
        else if(s.equals("Left")){if(x>0)x-=10;else x-=0;}
        else if(s.equals("Up")){if(y>150)y-=10;else y-=0;}
        else if(s.equals("Down")){if(y<320)y+=10;else y+=0;}
    repaint();
    }
    };
    addKeyListener(dir);
    }
    public void paint(Graphics g){
    img=getToolkit().getImage(getClass().getResource("Red_Car.gif"));
    buffer=createImage(38,42);
    Graphics gb=buffer.getGraphics();
    gb.drawImage(img,0,0,38,42,this);
    g.drawImage(buffer,x,y,null);

    }
    public static void main(String[] args){
    Ex18_1_db ob=new Ex18_1_db("Ex18_1_db");
    ob.setSize(360,360);
    ob.setVisible(true);
    }
    }
      

  8.   

    你的img, buffer不要每次都生成,这样写:
    public void paint(Graphics g){
     if(img==null)
        img=getToolkit().getImage(getClass().getResource("Red_Car.gif"));
     if(buffer==null){
       Graphics gb=buffer.getGraphics();
       gb.drawImage(img,0,0,38,42,this);
     }
     g.drawImage(buffer, x, y, null);
    }
    另外在你的update(Graphics g)直接调用paint方法可以减少闪烁
    public void update(Graphics g){
    paint(g);
    }
      

  9.   

    终于完成了````哎```自己想了一下加上前面高手指点的import java.awt.*;
    import java.awt.event.*;
    import java.net.*;public class Ex18_1_db extends Frame{
    int x=180,y=180;
    Image buffer,img;
    Graphics gb;
    public Ex18_1_db(String title){
    super(title);
    KeyListener dir=new KeyAdapter(){
    public void keyPressed(KeyEvent e){
    String s=e.getKeyText(e.getKeyCode());
        if(s.equals("Right")){if(x<320)x+=6;else x+=0;}
        else if(s.equals("Left")){if(x>0)x-=6;else x-=0;}
        else if(s.equals("Up")){if(y>150)y-=6;else y-=0;}
                 else if(s.equals("Down")){if(y<320)y+=6;else y+=0;}
    repaint();
    }
    };
    addKeyListener(dir);
    }
    public void paint(Graphics g){
    if(img==null){
    img=getToolkit().getImage(getClass().getResource("Red_Car.gif"));
    }
    if(buffer==null){
    buffer=createImage(getWidth(),getHeight());
    gb=buffer.getGraphics();
    }
    gb.clearRect(0,0,getWidth(),getHeight());
    gb.drawImage(img,x,y,this);
    g.drawImage(buffer,0,0,null);
    }
    public void update(Graphics g){
    paint(g);
    }
    public static void main(String[] args){
    Ex18_1_db ob=new Ex18_1_db("Ex18_1_db");
    ob.setSize(360,360);
    ob.setVisible(true);
    }
    }