其实就是repaint()问题,现在我也在研究先帮你up

解决方案 »

  1.   

    唉,原来我开始弄错了,Applet原来也是extends Panel的,我开始以为是继承frame的,这样说它本身也就是一个Panel了.
      

  2.   

    我觉得奇怪的是:当我改变窗口的大小的时候,明显的看到那个Panel里面的图在重绘了,可是它一重绘完之后,整个屏幕又马上变成背景色了,这到底是哪个方法在作怪了?
    现在我的系统中等有两个容器:一个就是CLASS本身,继承了APPLET的,一个就是我定义的PANEL,我上面有的地方要调用两次repaint():
    drawPanel.repaint();//调用Panel的刷新;
    repaint();//调用Frame的刷新;
    现在这两个方法被两个容器调用弄得我有点糊涂了.还有一个很重要的问题:现在当别的窗口从APPLET之上拖过的时候,这个事件居然捕捉不到了,APPLET之上的图就那样的被他擦掉了而不重绘,烦啊,为什么会这样了,这本来会自动调用repaint()这个方法的啊,为何不调用了呢?
      

  3.   

    当我的其它的窗口拖过我的APPLET时,其实那个PANEL是刷新了的,它马上用背景色填充了,可是没有调用我的drawImg()方法,也就是说不是执行了我自己重写的那个paint()方法,那是它调用了哪个paint()方法了,我的理解是那调用的是它自己的Panel的那个paint()方法,可我该如何重写Panel的paint()方法了,我上面重写的应该是重写的整个APPLET的paint()方法吧,搞不明白了.高手们,帮忙看看啊,感觉感谢!
      

  4.   

    你说了这多,把人都搞糊了。
    建议你看一下基础书,它们里面都会叫道Applet工作原理,及其各个方法是如何被调用以及何时被调用。
      

  5.   

    先谢谢楼上老兄的回复了.现在问题其实也就一个:
        
        在我的APPLET中有个单独的Panel,现在关键是如何重写那个Panel的paint()方法,我上面重写的paint()方法在Panel刷新的时候并不被调用啊.只有在整个APPLET窗口有变动的时候它才调用那个我重写的paint()方法,这个问题该如何解决了?
      

  6.   

    package com.readmapgis;import java.awt.*;
    import java.net.URL;
    import java.applet.Applet;
    import java.awt.event.*;
    import java.io.*;
    import java.util.Vector;
    import java.util.Hashtable;
    import java.util.Enumeration;
    import java.util.zip.GZIPInputStream;public class Read_wal_file extends Applet implements ActionListener{
    private Button butZoomIn;
       private Button butZoomOut;
       private Button butMove;
       private Button butFitView;
       private Button butZoomPart;
       private Button butQuery;
       private Button butRefresh;
       private Panel butPanel;
       private Panel drawPanel;
       private Label label;
       private Canvas canvas;
       private Scrollbar scrollbar;
    private Hashtable hashtable;

    String s = null;

    private float moveX1,moveX2,moveY1,moveY2,x,y;
    private float moveOffsetX,moveOffsetY;

    public Read_wal_file(){
    butZoomIn = new Button("·Å´ó");
         butZoomOut = new Button("ËõС");
         butZoomPart = new Button("¾Ö²¿·Å´ó");
         butMove = new Button("Òƶ¯");
         butFitView = new Button("È«ÆÁÏÔʾ");
         butRefresh = new Button("Ë¢ÐÂ");
         butQuery = new Button("ÐÅÏ¢²éѯ");
         butPanel = new Panel();
         drawPanel = new Panel();
         canvas = new Canvas();
         label = new Label();
    } public void init(){
    butPanel.setLayout(new GridLayout(1,7)) ;
         butPanel.add("East",butZoomIn);
         butPanel.add("Center",butZoomOut);
         butPanel.add(butMove);
         butPanel.add(butFitView);
         butPanel.add(butZoomPart);
         butPanel.add(butQuery);
         butPanel.add(butRefresh);
        
         butZoomIn.addActionListener(this);
         butZoomOut.addActionListener(this);
         butMove.addActionListener(this);
         butFitView.addActionListener(this);
         butZoomPart.addActionListener(this);
         butQuery.addActionListener(this);
         butRefresh.addActionListener(this);
        canvas.setBackground(Color.PINK) ;

        this.setLayout(new BorderLayout()) ;
        this.add(butPanel,BorderLayout.NORTH );
        this.add(drawPanel,BorderLayout.CENTER );
        this.add(label,BorderLayout.SOUTH );

        butPanel.setSize(500,20) ;
        drawPanel.setBackground(Color.cyan );
        
        drawPanel.addMouseListener(mouseListener);
        drawPanel.addMouseMotionListener(MouseMotionListener1); this.setVisible(true);
    System.out.println("panel size:"+drawPanel.size());
    System.out.println("panel max"+drawPanel.getMaximumSize());
    System.out.println("min"+drawPanel.getMinimumSize());
    System.out.println("x_width = "+drawPanel.getWidth());
    System.out.println("y_height = "+drawPanel.getHeight());
    this.setSize(1200,860);
         try{
         initDoc();
                
         }catch(Exception e){
         System.out.println("³õʼ»¯³ö´í");
         e.printStackTrace();
         }
    hashtable = ReadFile.hashtable;
    repaint();
    } public void initDoc(){
    String exName;
    URL url = null;
    try{
    url = new URL("http://aa/aa.wal");
    }catch(Exception e){
    e.printStackTrace();
    System.out.println("¶ÁÈ¡Îļþ³ö´í!");
    }
    exName = url.getFile();
    exName = exName.substring(exName.lastIndexOf(".")+1);
    exName = exName.toLowerCase();

    if(exName.equals("wal")){
    ReadFile.readLine(url);
    }else if(exName.equals("wat")){
    System.out.println("Ö´ÐжÁµã");
    ReadFile.loadDot(url);
    }else if(exName.equals("wap")){
    ReadFile.readPoly(url);
    }else{
    System.out.println("ÕÒ²»µ½Îļþ");
    System.exit(1);
    }
    }
    MouseMotionListener MouseMotionListener1 = new MouseMotionAdapter(){
           public void mouseDragged(MouseEvent e){
            x = e.getPoint() .x;
            y = e.getPoint() .y;
    if(SysStatus.getIsZoomPart()){
            Graphics g = drawPanel.getGraphics();
             g.setXORMode(getBackground() ) ;
             g.drawRect((int)moveX1,(int)moveY1,(int)(x-moveX1),(int)(y-moveY1));
    g.drawRect((int)moveX1,(int)moveY1,(int)(moveX2-moveX1),(int)(moveY2-moveY1));
            }      }
           public void mouseMoved(MouseEvent e){
            label.setText("Ä¿Ç°Êó±êλÖÃ:"+"\tX="+e.getX() +"\tY="+e.getY() );
          }
        };

    MouseListener mouseListener = new MouseAdapter(){

           public void mousePressed(MouseEvent e){
             moveX1 = e.getPoint() .x;
             moveY1 = e.getPoint() .y;
    label.setText("°´ÏÂÊó±êλÖÃΪ"+e.getPoint().x);
    System.out.println("°´ÏÂÊó±êλÖÃΪ"+e.getPoint().x);
           }
          
           public void mouseReleased(MouseEvent e){
            moveX2 = e.getPoint() .x;
             moveY2 = e.getPoint() .y;
             System.out.println("ËÉ¿ªÊó±êλÖÃΪ"+e.getPoint().x);
             //Èç¹ûÊÇÔÚÖ´ÐÐÒƶ¯²Ù×÷;
             if(SysStatus.getIsMove()){
             //¼ÆËãÒƶ¯Æ«ÒÆÁ¿;
             moveOffsetX = moveX2 - moveX1;
    moveOffsetY = moveY2 - moveY1;

    ChangeXY.setMove(moveOffsetX,moveOffsetY);
             label.setText("ËÉ¿ªÊó±êλÖÃΪ"+e.getPoint().x+"\t\t¸Ã´ÎÒƶ¯Æ«ÒÆÁ¿Îª:X:"+moveOffsetX+",Y:"+moveOffsetY);

    drawPanel.repaint();
    repaint();
             }
             if(SysStatus.getIsZoomPart()){
             moveOffsetX = moveX2 - moveX1;
             moveOffsetY = moveY2 - moveY1;
            
             repaint();
             }
           }
          
           public void mouseClicked(MouseEvent e){
           if(SysStatus.getIsQuery()){
           IDquery(e.getPoint().x,e.getPoint().y);
           }
           }
        };

    public void actionPerformed(ActionEvent e) {//¶¨Ò尴ťʼþ¼àÌý;
    if(e.getSource() == butMove){
    System.out.println("Òƶ¯");
    Scale.fit();
    SysStatus.setIsMove(true);
    }
    ........
    }
    public void paint(Graphics g){
    super.paint(g);
    drawImg();
    drawPanel.paint(g);
    System.out.println("µ÷ÓÃPAINT");
    } public void drawImg(){
    int x1,x2,y1,y2;
    String lineSet;//ÏßÐÎÉèÖÃ;
    Vector v = new Vector();
    Graphics g = drawPanel.getGraphics();
    PointXY getXY1 = null;
                      PointXY getXY2 = null;
             float rectMaxX,rectMinX,rectMaxY,rectMinY;//ÖØмÆËãÍâ½Ó¾ØÐÎ;
            
           if(hashtable != null){
    for(int k=0;k<lineCount-1;k++){
    v = (Vector)hashtable.get(new Integer(k));
    rectMaxX = rectMaxY = -10000;
    rectMinX = rectMinY = 10000;
    getXY1 =(PointXY)v.get(1);
    }
    for(int i=2;i<v.size()-2;i++){
           getXY2=(PointXY)v.get(i);
      
           x1 = (int)getXY1.getX();
           y1 = (int)getXY1.getY();
           x2 = (int)getXY2.getX();
           y2 = (int)getXY2.getY();   g.drawLine(x1,y1,x2,y2);
          
           getXY1=getXY2;//&frac12;&laquo;getXY1&Ouml;&cedil;&Iuml;ò&Iuml;&Acirc;&Ograve;&raquo;&cedil;&ouml;&micro;&atilde;;
          
    }
    }
        }

    }
      

  7.   

    首先你要明白的一点就是Applet类的Paint方法是在何种情况下被调用。三种情况:1、界面刚显示出来的时候;2、放大或缩小的时候(包括最大最小化的操作);3、被别的应用程序的界面覆盖的时候。
    那么你写的panel类的paint方法是在Applet类的Paint方法中被调用的。那么也只用上面三种情况下会调用你的paint方法。
    如果想在其它情况下调用,就写在相应的代码处(调用你的panel类的repaint方法)。
      

  8.   

    多谢 noratong(诺拉) 了现在有2个问题在这里我觉得很迷惑;
    我APPLET有三部分,从上到下三个panel,中间的一大块是画图用的一个大Panel .1、当有别的窗口拖过我的APPLET的时候,如果别的窗口也经过我APPLET的窗口的四边(上下左右APPLET的整个窗口的最大边),那时会调用我得写的Paint方法,我的paint()方法调用了drawImg()方法重新画图.但这个时候有时候图会重新画过,有时候了只是背景刷新.不知为何?2、当别的窗口只是在我的APPLET窗口的那个大Panel区域拖动的时候,则只是背景刷新,根本就不会调用我重写的paint()方法了。也不知为何?(但如果我把图直接画在Applet中,就是不另外再定义一个Panel来画图,则上面的问题都不会发生了)