1.CanvasDraw中没有paint()方法呀,把的源码贴上来我帮你改
2.缓冲的缘故

解决方案 »

  1.   

    import java.applet.*;
    import java.awt.*;
    import java.awt.event.*;public class TestCanvas extends Applet
    {
    CanvasDraw cd; public void init()
    {
    cd=new CanvasDraw(new Dimension(200,180),this);
    cd.setBackground(Color.pink);
    add(cd);
    cd.requestFocus();
    }
    }class CanvasDraw extends Canvas implements KeyListener
    {
    Applet m_Parent; //包含画布的Applet对象引用
    boolean m_bFlag=false; //是否用鼠标画线
    int currentX=0,currentY=0; //当前鼠标位置
    int startX=0,startY=0; //直线的开始坐标
    StringBuffer sb=new StringBuffer(); //保存用户键盘输入的字符 CanvasDraw(Dimension d,Applet p) //构造函数
    {
    m_Parent=p;
    setSize(d);
    setBackground(Color.gray);
    addKeyListener(this);
    addMouseListener(new MouseAdpt(this));
            addMouseMotionListener(new MouseMotionAdpt(this));
    }
    void setStart(int x,int y) //设定直线的开始坐标
    {
    startX=x;
    startY=y;
    }
    void setCurrent(int x,int y) //设定当前鼠标位置
    {
    currentX=x;
    currentY=y;
    }
    void setMouseDragged(boolean b) //设定鼠标拖动状态
    {
    m_bFlag=b;
    }
    void showMeg(String s) //显示状态行
    {
    m_Parent.showStatus(s);
    }
    void clearAll() //复位
    {
    startX=0;
    startY=0;
    currentX=0;
    currentY=0;
    repaint();
    }

    public void keyTyped(KeyEvent e) //按键敲击事件
    {
    char ch=e.getKeyChar();
    sb.append(ch);
    showMeg("击键"+sb.toString());
    repaint();
    }
    public void keyPressed(KeyEvent e){}
    // public void keyReleased(KeyEvent e){}

    public void paint(Graphics g)
    {
    g.drawString("("+currentX+","+currentY+")"+sb,10,20);
    if(m_bFlag)
    g.drawLine(startX,startY,currentX,currentY); //画线
    this.requestFocus();
    }
    }class MouseAdpt extends MouseAdapter //从鼠标监听事件裁剪类派生
    {
    CanvasDraw m_Parent;
    MouseAdpt(CanvasDraw p) //构造函数
    {
    m_Parent=p;
    }
    public void mousePressed(MouseEvent e)
    {
    m_Parent.setStart(e.getX(),e.getY()); //设定直线的开始坐标
            //        m_Parent.setMouseDragged(true);
    m_Parent.showMeg("您开始划线");
    }
    public void mouseReleased(MouseEvent e)
    {
                    m_Parent.setCurrent(e.getX(),e.getY());
             //       m_Parent.repaint();
            //        m_Parent.setMouseDragged(false);
           //       m_Parent.repaint();
    m_Parent.showMeg("您画出了一条直线");
    }
    public void mouseEntered(MouseEvent e)
    {
    m_Parent.showMeg("鼠标进入画布");
    }
    public void mouseExited(MouseEvent e)
    {
    m_Parent.showMeg("鼠标移出画布");
    }
    }class  MouseMotionAdpt extends MouseMotionAdapter //从鼠标动作监听事件裁剪类派生
    {
    CanvasDraw m_Parent;
    MouseMotionAdpt(CanvasDraw p) //构造函数
    {
    m_Parent=p;
    }
    public void mouseMoved(MouseEvent e)
    {
    m_Parent.setCurrent(e.getX(),e.getY());
    m_Parent.setMouseDragged(false);
    m_Parent.repaint(10,0,60,30);
    }
    public void mouseDragged(MouseEvent e)
    {
    m_Parent.setCurrent(e.getX(),e.getY());
            m_Parent.setMouseDragged(true);
            m_Parent.repaint();
    }
    }
      

  2.   

    paint()方法是Container类的方法啊
    你的m_Parent没有继承Container啊IE有Applet的缓冲,所以....
      

  3.   

    顺便一说,用Swing吧
    很多时候paint(),update()对重量级的组件是无效的:)
      

  4.   

    重载update函数就可以了。
    把刷新背景这个操作去掉。
      

  5.   

    重载update()好使吗? 不见得。我 建议你把所有的操作都执行到一个缓冲的画布上,然后调用pant()把画布写到屏幕,而不是直接写屏。 第二个问题已经有了答案。
      

  6.   

    不好意思
    “paint()方法是Container类的方法啊,你的m_Parent没有继承Container啊”
    完全是胡说八道了嗯,如果你只是想不清除画布,只要这样就可以了
    public void update(Graphics g){
      paint(g);
    }加入CanvasDraw类的定义中。但是可能不会有你想看到的那种效果了,你试一试吧