画布重画的问题 错了,应该是paint(Graphics g)方法. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 应该是没有使用paint方法的缘故,这是因为在屏幕上画对象,跟在屏幕上画图是有区别的。 但是我画图的时刻是在读取文件后呀画图语句用到的数据一开始都没有,如果在paint里面画,肯定要出错的 我也碰到过这问题谁试过在 gif 动画前 draw 些东西? gif 一动全刷光了..... >但是我画图的时刻是在读取文件后呀>画图语句用到的数据一开始都没有,如果>在paint里面画,肯定要出错的判断一下就好了. 我在paint里面绘图了,用的是canvas.getGraphics()方法不知道为什么,响应windowActivated、componentResized时图就没有了,但是用canvas设置的颜色却没有变化 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(); } } } 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(); }} 这个问题我感觉还是出在public void paint(Graphics g)方法中,你可以这样public void paint(Graphics g){ super.paint(g); //然后再你的那些代码.}你的这个问题就是在重画JFrame的时候把Canvas的东西给覆盖掉了.不要用Canvas,直接用JComponent也可以直接画的.我以前做过类似的东西,如果是用JComponent的话一定是没有问题的.Canvas我没有用过,你先这样试试吧.你贴出来的代码太乱了,要不我可以替你试试. 其实任何一个组件的paint(Graphics g)就已经能够获得Graphics了,为什么还要用Canva?建议去掉canvas 用一个Panel代替,在其paint()方法中将原来你的重画代代码移动过来,并 canvas.getGraphics() 改为 g. canvas.getGraphics() 这样画上去的东西就像在玻璃上图水彩颜料,一抹就没了 重载paintComponent(Graphics g);把绘图代码天加到函数里,记得先凋用super.paintComponent(g);吆。 怎么写JAVA正则表达式 新手求指点! 怎么给.doc的word文档加密? 新手:jdk环境变量配置问题? 为什么我写的代码设置好了菜单功能却不能显现出菜单? 50分!!!!!!!写好的箱式布局,如何调整? 小妹有个问题,希望高手帮忙!!! 请问vector怎么用? 咋搞地 请教一个关于Tomcat下配制虚拟主机的问题,请高手指点??????? 初学者请大哥们帮忙! *.class经过javac编译后的文件能否直接运行
画图语句用到的数据一开始都没有,如果
在paint里面画,肯定要出错的
谁试过在 gif 动画前 draw 些东西?
gif 一动全刷光了.....
>画图语句用到的数据一开始都没有,如果
>在paint里面画,肯定要出错的
判断一下就好了.
绘图了,用的是canvas.getGraphics()方法
不知道为什么,响应windowActivated、componentResized时图就没有了,但是用
canvas设置的颜色却没有变化
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();
}
}
}
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();
}}
你可以这样
public void paint(Graphics g){
super.paint(g);
//然后再你的那些代码.
}你的这个问题就是在重画JFrame的时候把Canvas的东西给覆盖掉了.
不要用Canvas,直接用JComponent也可以直接画的.
我以前做过类似的东西,如果是用JComponent的话一定是没有问题的.
Canvas我没有用过,你先这样试试吧.
你贴出来的代码太乱了,要不我可以替你试试.
建议去掉canvas 用一个Panel代替,在其paint()方法中将原来你的重画代代码移动过来,并 canvas.getGraphics() 改为 g.
就像在玻璃上图水彩颜料,一抹就没了