的确要重写canvas的paint()方法。因为小窗口只是遮住了canvas,并没有影响applet,所以applet的paint不会被调用。你把你的那个canvas写成另外的一个类,在这个类中再写一个针对canvas的paint方法,试试看。

解决方案 »

  1.   

    你的draw()是不是应该放在canvas里,由paint(Graphics g)调用,把Graphics g = canvas.getGraphics();去掉
      

  2.   

    这里的paint(Graphics g)应该是canvas里的paint
      

  3.   

    对,我也觉得那个paint()应该是canvas里的paint(),可我在代码中根本不知怎么写到canvas中去啊,我试试  stamp80(清风扑面)  的将canvas另写一个类看看
      

  4.   

    问题解决了,是重新写了一个canvas类.
    class myCanvas extends Canvas{

    public void paint(Graphics g){
    System.out.println("调用canvas刷新");
    drawImg();
    }
    }
    然后添加到APPLET中去的是myCanvas的实例就行了,拼命的刷新,爽!
    请pxboy(阿土仔)老兄去此处接分:
    http://expert.csdn.net/Expert/topic/2297/2297515.xml?temp=.131222
    在那个帖子发了很久,没人解决,也是100分,我想将这里的分全部留给stamp80(清风扑面) 了.非常感谢两位老兄,不过对这里这种应用,以及这样用了之后的刷新调用机制,小弟不是太明白,两位不知是否能解释一二,谢谢!另外:还有一个这样的问题小弟现在也没能解决:请教一下老兄:
      在我的APPLET中有一个操作是用鼠标在APPLET之上拖出一个矩形出来,然后再操作.
    MouseMotionListener MouseMotionListener1 = new MouseMotionAdapter(){
           public void mouseDragged(MouseEvent e){
            x = e.getPoint() .x;
            y = e.getPoint() .y;
            Graphics g = canvas.getGraphics();
            g.setXORMode(canvas.getBackground());//是应该用这种模式吧;????
              g.drawRect((int)moveX1,(int)moveY1,(int)(x-moveX1),(int)(y-moveY1));
            }
            //moveX1,moveY1为鼠标点下时的坐标点
          }
          };
    我想要的结果就是在拖动鼠标的过程中始终只能一个矩形框出来,可现在却出现了无数个矩形框,因为在拖动过程中产生了无数个的x,y.
    就上面一样的代码,我在JAVA其它的应用程序中用了可以的,不知为何到了APPLET中就不止出一个矩形框了?
      

  5.   

    我也正在写applet,关注,学习
    用异或模式啊?
      

  6.   

    我觉得应该是这样的:
    你说的这种情况,重绘时只是重绘canvas,并不是整个applet都被重绘,因为拖的窗口只是在canvas上移动,这是个人看法g.setXORMode(canvas.getBackground());
    具体看JDK文档,似乎只是颜色的交替,对于无数个矩形框,我觉得你是否应该repaint()一下?
      

  7.   

    在mouseDragged里调用容器的repaint()方法
      

  8.   

    郁闷,CSDN真TMD慢,从上午看完那贴子后就一直进不来了,在那个贴子里给pxboy(阿土仔) 老兄结贴也一直没结成功.我先试试上面的方法,再次谢了!
      

  9.   

    刚刚试过了,如果我在mouseDragged里加上canvas.repaint(),是可以实现始终只是拖动着一个矩形,可这样一样,屏幕闪烁得太厉害了.因为我的canvas的paint()方法中有个drawImg(),在拖动过程中,屏幕在不停的重画图,闪得好厉害啊.
    如果我是加APPLET的 repaint(),则没有作用的.该如何解决啊,老兄
      

  10.   

    请问在你的
    class myCanvas extends Canvas{

    public void paint(Graphics g){
    System.out.println("调用canvas刷新");
    drawImg();
    }
    }drawImg()是指代什么?
      

  11.   

    那你在paint里绘矩形,repaint()还是要的
      

  12.   


          boolean isDrag = false;
          int moveX1 = 0;
          int moveY1 = 0;
          int moveX2 = 0;
          int moveY2 = 0;
                myCanvas .addMouseListener(new MouseAdapter()
                {
                      public void mousePressed(MouseEvent e)
                      {
                            moveX1 = e.getX();
                            moveY1 = e.getY();
                            isDrag = true;
                      }
                      public void mouseReleased(MouseEvent e)
                      {
                            isDrag = false;
                            myCanvas .repaint();                  }
                });            myCanvas .addMouseMotionListener(new MouseMotionAdapter()
                {
                      public void mouseDragged(MouseEvent e)
                      {
                            isDrag = true;
                            myCanvas .repaint();
                            moveX2 = e.getPoint().x;
                            moveY2 = e.getPoint().y;
                      }
                });                  public void paint(Graphics g)
                      {
                            drawImg();
                            if(isDrag)
                                  g.drawRect( (int)moveX1, (int)moveY1, (int) (moveX2 - moveX1), (int) (moveY2 - moveY1));
                      }
      

  13.   

    绘制操作是放在paint里的,最好别处不要放,不然到处都可以绘制组件,不好控制
      

  14.   

    谢过 pxboy(阿土仔)老兄了.我觉得你的方法还是不太可行的啊,在整个的拖动过程中,会产生无数个的事件的,如上面的代码,则会拼命的刷新myCanvas,这样一来也就会拼命的调用drawImg()了,这会引起整个屏幕闪烁的很厉害的.(我的drawImg()中画的内容很多的).我觉得是否应该在画的时候让现在已经有的图保持不动,要刷新也只是拖出来的那个矩形去刷新,那样可能就会达到要求了.
    找了一份资料看,g.setXORMode(canvas.getBackground());这种模式就是实现这种要求的,上面画的内容更新,而下面已经画好的内容不更新,我觉得这个模式应该是需要用上的.还有,和我上面同样的代码,我以前写过一个application的JAVA画图小程序,在那里面居然在画矩形的时候好好的,始终只是显示一根线而已,不知把它移植到APPLET中后有什么不同了,那种效果就不出来了.
      

  15.   

    刚刚试过一种方法了: 勉强还可行.
    MouseMotionListener MouseMotionListener1 = new MouseMotionAdapter(){
           public void mouseDragged(MouseEvent e){
            x = e.getPoint() .x;
            y = e.getPoint() .y;
            Graphics g = canvas.getGraphics();
            g.setXORMode(canvas.getBackground());//是应该用这种模式吧;????
              g.drawRect((int)moveX1,(int)moveY1,(int)(x-moveX1),(int)(y-moveY1));
             g.drawRect((int)moveX1,(int)moveY1,(int)(x-moveX1),(int)(y-moveY1));
                  //画两次
            }
            //moveX1,moveY1为鼠标点下时的坐标点
          }
          };
    将那个矩形画两次就看不到无数个矩形了,始终只能看到一个,不过只有在拖动的过程中才看得到矩形,一停下鼠标不拖动就被另一个画的刷新成背景色了
      

  16.   

    楼主你还注意到rectangle有一个方法是getBounds。它能得到你所画矩形的外框,你只要拖动鼠标时注意repaint(getBounds())这个矩形外框,就不用刷新整个canvas而只刷新这个矩形框了。
      

  17.   

    to stamp80(清风扑面) :
    我觉得在这种情况下,如果鼠标一拖动就用刷新总是不太好的吧,即使只是刷新矩形范围内的部分,也会给人太过闪烁的感觉的吧,我以前见过别人用APPLET做的,也是在原有的图上拖鼠标画出一个矩形出来,那种效果很好的,底下的图是一点都不闪烁的,连边拖边画的矩形的闪烁也不是很明显.
    我上面的方法就是那个边拖边画的矩形闪烁太过明显,还有,当鼠标停止不动的时候,那个矩形会消失的(给第二次画的擦掉了),这点感觉不爽.