错了,应该是paint(Graphics g)方法.

解决方案 »

  1.   

    应该是没有使用paint方法的缘故,这是因为在屏幕上画对象,跟在屏幕上画图是有区别的。
      

  2.   

    但是我画图的时刻是在读取文件后呀
    画图语句用到的数据一开始都没有,如果
    在paint里面画,肯定要出错的
      

  3.   

    我也碰到过这问题
    谁试过在 gif 动画前 draw 些东西? 
    gif 一动全刷光了.....
      

  4.   

    >但是我画图的时刻是在读取文件后呀
    >画图语句用到的数据一开始都没有,如果
    >在paint里面画,肯定要出错的
    判断一下就好了.
      

  5.   

    我在paint里面
    绘图了,用的是canvas.getGraphics()方法
    不知道为什么,响应windowActivated、componentResized时图就没有了,但是用
    canvas设置的颜色却没有变化
      

  6.   

    package myprojects.gisview;
    import java.awt.*;
    import java.awt.Graphics;
    import java.awt.event.*;
    import java.io.*;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import java.lang.*;
    class GisView extends JFrame implements ActionListener//,ItemListener
    {
    MenuBar m_MenuBar;
    Menu menuFile,menuEdit,menuHelp;
    MenuItem mi_File_Open,mi_File_Close,mi_File_Exit,mi_Edit_Out,mi_Edit_In;
    Canvas canvas;
      FileDialog fd; 
      static readshape rdfile=null;
      int width ;
      int height ;
      double scalex;  //x方向比例尺
      double scaley;  //y方向比例尺 GisView()
    {
    super("读取ShapeFile文件");
    /////////////////////////////////about menuFile
    m_MenuBar=new MenuBar();

    menuFile=new Menu("文件");
    mi_File_Open=new MenuItem("打开");
    mi_File_Close=new MenuItem("关闭");
    mi_File_Exit=new MenuItem("退出");

    mi_File_Close.setShortcut(new MenuShortcut('C'));
    mi_File_Exit.setShortcut(new MenuShortcut('X'));

    mi_File_Open.addActionListener(this);
    mi_File_Close.addActionListener(this);
    mi_File_Exit.addActionListener(this);

    menuFile.add(mi_File_Open);
    menuFile.add(mi_File_Close);
    menuFile.addSeparator(); 
    menuFile.add(mi_File_Exit);

    /////////////////////////////////////about menuEdit
    menuEdit=new Menu("编辑");
    mi_Edit_Out=new MenuItem("放大");
    mi_Edit_In=new MenuItem("缩小");

    mi_Edit_Out.setShortcut(new MenuShortcut('F'));
    mi_Edit_In.setShortcut(new MenuShortcut('S'));
    menuEdit.add(mi_Edit_Out);
    menuEdit.add(mi_Edit_In);

    menuHelp=new Menu("帮助");

    m_MenuBar.add(menuFile);
    m_MenuBar.add(menuEdit);
    m_MenuBar.add(menuHelp);
    this.setMenuBar(m_MenuBar);
    /////////////////////////////////about Canvas
         canvas = new Canvas();
         canvas.setBackground(Color.white);
        
         this.getContentPane().add("Center",canvas); setSize(600,400); addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) 
                {
                    System.out.println("Exit when Closed event");
                    System.exit(0); //退出应用程序
                }            public void windowActivated(WindowEvent e) 
                {
                    repaint();
                }
            });
            addComponentListener(new ComponentAdapter()
        {
                public void componentResized(ComponentEvent e)
                {

            }
        });


    }

    public void paint(Graphics g)
    {
         width = canvas.getWidth();
         height = canvas.getHeight();
                
        canvas.getGraphics().clearRect(0,0,width,height);
        
                
        
            if(rdfile!=null && rdfile.geom!=null)
            {
          if( width> height)
        {
            scalex = width/(rdfile.xmax - rdfile.xmin);
        }
        else
        {
            scaley = height/(rdfile.ymin - rdfile.ymax);
        }
        
        switch(rdfile.shapetype)
            {
                case 1:
                {
                }
                break;
                case 3:
                {
           DrawPolyline(rdfile); // 绘制线段
                }
                break;
                case 5:
                {
            DrawPolygon(rdfile);
                }
                break;
            }         
            }
    }
    public void actionPerformed(ActionEvent e)
    {
    if(e.getActionCommand()=="退出")
    {
    dispose();
    System.exit(0);
    }
    if(e.getActionCommand()=="关闭")
    {
    System.exit(0);
    }
    if(e.getActionCommand()=="打开")
    {
    JFileChooser chooser = new JFileChooser ();
        ExampleFileFilter filter = new ExampleFileFilter();
        filter.addExtension("shp");
        filter.setDescription("shape 文件");
        
        chooser.setFileFilter(filter);
        
    chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);

    int retval = chooser.showOpenDialog(null);
            if(retval == JFileChooser.APPROVE_OPTION) 
            {
                rdfile = new  readshape (chooser.getSelectedFile().getPath());
       repaint();
         }
    }
    }
      

  7.   


    public void DrawPolyline(readshape readfile)
    {
       for(int i=0;i<readfile.geom.size();i++)//-
       {
       if( ((PolyLine)readfile.geom.elementAt(i)).NumParts == 1 )//简单线段
       {
                for(int j=0;j<((PolyLine)readfile.geom.elementAt(i)).NumPoints-1;j++)
                {
                 canvas.getGraphics().drawLine(  (int) ( ( ((PolyLine)readfile.geom.elementAt(i)).x[j] - readfile.xmin ) * scalex ),
                 (int) ( ( ((PolyLine)readfile.geom.elementAt(i)).y[j] - readfile.ymax )* (-1.0*scalex) ),
                 (int) ( ( ((PolyLine)readfile.geom.elementAt(i)).x[j+1] - readfile.xmin ) * scalex ),
                 (int) ( ( ((PolyLine)readfile.geom.elementAt(i)).y[j+1]- readfile.ymax )* (-1.0*scalex) ) );             
                }   
       }
       else if( ((PolyLine)readfile.geom.elementAt(i)).NumParts > 1 ) //符合线段
       {
      
    for(int k=0;k<((PolyLine)readfile.geom.elementAt(i)).NumParts-1;k++)
    {
    for(int j = ((PolyLine)readfile.geom.elementAt(i)).Parts[k]; j < ((PolyLine)readfile.geom.elementAt(i)).Parts[k+1] -1; j++)
    {
                 canvas.getGraphics().drawLine(  (int) ( ( ((PolyLine)readfile.geom.elementAt(i)).x[j] - readfile.xmin ) * scalex ),
                 (int) ( ( ((PolyLine)readfile.geom.elementAt(i)).y[j] - readfile.ymax )* (-1.0*scalex) ),
                 (int) ( ( ((PolyLine)readfile.geom.elementAt(i)).x[j+1] - readfile.xmin ) * scalex ),
                 (int) ( ( ((PolyLine)readfile.geom.elementAt(i)).y[j+1]- readfile.ymax )* (-1.0*scalex) ) );

    }

    }
    for(int j = ((PolyLine)readfile.geom.elementAt(i)).Parts[((PolyLine)readfile.geom.elementAt(i)).NumParts-1 ]; j< ((PolyLine)readfile.geom.elementAt(i)).NumPoints-1 ; j++)
    {
                canvas.getGraphics().drawLine(  (int) ( ( ((PolyLine)readfile.geom.elementAt(i)).x[j] - readfile.xmin ) * scalex ),
                (int) ( ( ((PolyLine)readfile.geom.elementAt(i)).y[j] - readfile.ymax )* (-1.0*scalex) ),
                (int) ( ( ((PolyLine)readfile.geom.elementAt(i)).x[j+1] - readfile.xmin ) * scalex ),
                (int) ( ( ((PolyLine)readfile.geom.elementAt(i)).y[j+1]- readfile.ymax )* (-1.0*scalex) ) );

    }   
      
       }
        }
    }

    public void DrawPolygon(readshape readfile)
    {
       for(int i=0;i<readfile.geom.size();i++)//-
       {
       if( ((MyPolygon)readfile.geom.elementAt(i)).NumParts == 1 )//简单线段
       {
                for(int j=0;j<((MyPolygon)readfile.geom.elementAt(i)).NumPoints-1;j++)
                {
                
                 canvas.getGraphics().drawLine(  (int) ( ( ((MyPolygon)readfile.geom.elementAt(i)).x[j] - readfile.xmin ) * scalex ),
                 (int) ( ( ((MyPolygon)readfile.geom.elementAt(i)).y[j] - readfile.ymax )* (-1.0*scalex) ),
                 (int) ( ( ((MyPolygon)readfile.geom.elementAt(i)).x[j+1] - readfile.xmin ) * scalex ),
                 (int) ( ( ((MyPolygon)readfile.geom.elementAt(i)).y[j+1]- readfile.ymax )* (-1.0*scalex) ) );             
                }   
       }
       else if( ((MyPolygon)readfile.geom.elementAt(i)).NumParts > 1 ) //符合线段
       {
      
    for(int k=0;k<((MyPolygon)readfile.geom.elementAt(i)).NumParts-1;k++)
    {
    for(int j = ((MyPolygon)readfile.geom.elementAt(i)).Parts[k]; j < ((MyPolygon)readfile.geom.elementAt(i)).Parts[k+1] -1; j++)
    {
                 canvas.getGraphics().drawLine(  (int) ( ( ((MyPolygon)readfile.geom.elementAt(i)).x[j] - readfile.xmin ) * scalex ),
                 (int) ( ( ((MyPolygon)readfile.geom.elementAt(i)).y[j] - readfile.ymax )* (-1.0*scalex) ),
                 (int) ( ( ((MyPolygon)readfile.geom.elementAt(i)).x[j+1] - readfile.xmin ) * scalex ),
                 (int) ( ( ((MyPolygon)readfile.geom.elementAt(i)).y[j+1]- readfile.ymax )* (-1.0*scalex) ) );

    }

    }
    for(int j = ((MyPolygon)readfile.geom.elementAt(i)).Parts[((MyPolygon)readfile.geom.elementAt(i)).NumParts-1 ]; j< ((MyPolygon)readfile.geom.elementAt(i)).NumPoints-1 ; j++)
    {
                canvas.getGraphics().drawLine(  (int) ( ( ((MyPolygon)readfile.geom.elementAt(i)).x[j] - readfile.xmin ) * scalex ),
                (int) ( ( ((MyPolygon)readfile.geom.elementAt(i)).y[j] - readfile.ymax )* (-1.0*scalex) ),
                (int) ( ( ((MyPolygon)readfile.geom.elementAt(i)).x[j+1] - readfile.xmin ) * scalex ),
                (int) ( ( ((MyPolygon)readfile.geom.elementAt(i)).y[j+1]- readfile.ymax )* (-1.0*scalex) ) );

    }   
      
       }
        }
    }



    public static void main(String args[]) 
    {
    Frame frm=new GisView();
    frm.show();
        }}
      

  8.   

    这个问题我感觉还是出在public void paint(Graphics g)方法中,
    你可以这样
    public void paint(Graphics g){
        super.paint(g);
        //然后再你的那些代码.
    }你的这个问题就是在重画JFrame的时候把Canvas的东西给覆盖掉了.
    不要用Canvas,直接用JComponent也可以直接画的.
    我以前做过类似的东西,如果是用JComponent的话一定是没有问题的.
    Canvas我没有用过,你先这样试试吧.
    你贴出来的代码太乱了,要不我可以替你试试.
      

  9.   

    其实任何一个组件的paint(Graphics g)就已经能够获得Graphics了,为什么还要用Canva?
    建议去掉canvas 用一个Panel代替,在其paint()方法中将原来你的重画代代码移动过来,并 canvas.getGraphics() 改为 g.
      

  10.   

    canvas.getGraphics() 这样画上去的东西
    就像在玻璃上图水彩颜料,一抹就没了
      

  11.   

    重载paintComponent(Graphics g);把绘图代码天加到函数里,记得先凋用super.paintComponent(g);吆。