`

J2SE画路网图经验总结

阅读更多
  这个星期用J2SE做了一个绘制路网图的小应用开发程序,做出来的图要上传到服务器上,并且要把图上的每一条道路信息提取出来,保存到服务器数据库中。看似很简单,但对于菜鸟水平的我来说真是一个严峻的挑战,因为上面给的时间只有4-5天,搞完项目才能验收,包括表结构的架构、模块逻辑的分析、跟其他模块的整合。期间遇到很多困难,大公无私的网友总是在我最困难的时候给了我很大的帮助。今天总结一下经验,希望大家以后遇到这些问题后,能从上面找到答案。

就从画图开始吧。

1.在面板上画一条可改变大小的线;
Graphics2D g = (Graphics2D)graph;
				g.setRenderingHint(RenderingHints.KEY_ANTIALIASING , RenderingHints.VALUE_ANTIALIAS_ON);
				g.setStroke(new  BasicStroke(10.0f));
						gg.setColor(new Color(0,255,0));
						gg.drawLine(startX,startY,endX,endY);


2.这样画出来的线,最小化窗口后线就会不见了,还得用一个图片缓存保存起来。
定义一个BufferedImage img, 画线的时候双缓存,
Graphics2D gg = (Graphics2D)img.getGraphics(); 
				gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING , RenderingHints.VALUE_ANTIALIAS_ON);
				gg.setStroke(new  BasicStroke(10.0f));
gg.setColor(new Color(0,255,0));
						gg.drawLine(startX,startY,endX,endY);

最后重写绘制面板中的paint方法:
JPanel pan2 =new JPanel(){
			public void paint(Graphics g){ 
                                   g.drawImage(img,0,0,null); 
				};


3.panel中文字竖放,其实就是把字串文字一个个提取出来,然后放到上一个文字的下方。
4.操作撤销问题,把数据用List存起来,然后重画。
5.画一条可拖拽的线
pan2.addMouseMotionListener(new MouseMotionListener(){

			public void mouseDragged(MouseEvent e) {
				
			}
			//拖拽线条
			public void mouseMoved(MouseEvent e) {
				if(isStart==false){//如果单击了第一个点后
					Container c=(Container)e.getSource();
					Graphics graph=c.getGraphics(); 
					Graphics2D g = (Graphics2D)graph;
					g2d = g;//
					g.setRenderingHint(RenderingHints.KEY_ANTIALIASING , RenderingHints.VALUE_ANTIALIAS_ON);
					g.setStroke(new   BasicStroke(10.0f));

					drawAll(g);
					//repaint
					g.setColor(new Color(0,255,0));
					g.drawLine(startX, startY, e.getX(), e.getY());
					
					oldX=e.getX();
					oldY=e.getY();
				}
			}
			
		});

6.一般画出来的线会带有锯齿,这样画一条平滑的线:
					Graphics2D g = (Graphics2D)graph;
					g2d = g;//
					g.setRenderingHint(RenderingHints.KEY_ANTIALIASING , RenderingHints.VALUE_ANTIALIAS_ON);
					g.setStroke(new   BasicStroke(10.0f));
						g.setColor(new Color(0,255,0)); 			
						g.drawLine(startX, startY, endX, endY);


7.把panel上画的图用BufferedImage 保存一张jpg图片:
		BufferedImage bimage; 	
bimage = new BufferedImage(256,160, BufferedImage.TYPE_INT_RGB); 
						Graphics2D bImage = (Graphics2D)bimage.getGraphics(); 
					bImage.setRenderingHint(RenderingHints.KEY_ANTIALIASING , RenderingHints.VALUE_ANTIALIAS_ON);
						bImage.setStroke(new  BasicStroke(10.0f));
bImage.setColor(new Color(0,255,0));
bImage.drawLine(0,0,278,299);
					FileOutputStream out=new FileOutputStream(savePath+saveName); //先用一个特定的输出文件名 
						JPEGImageEncoder encoder =JPEGCodec.createJPEGEncoder(out); 
						JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bimage); 
						param.setQuality(0.5f, true); 
						encoder.encode(bimage, param); 

8.JPG转BMP图片:
						//jpg转bmp
				        FileImageInputStream fiis=new FileImageInputStream(new File(savePath+saveName));
				        FileImageOutputStream fios=new FileImageOutputStream(new File(savePath+saveName));
				        
				        ImageReader jpegReader = null;
				        Iterator<ImageReader> it1 = ImageIO.getImageReadersByFormatName("jpeg");
				        if(it1.hasNext())
				        {
				              jpegReader = it1.next();                           
				        }
				        jpegReader.setInput(fiis);
				         ImageWriter bmpWriter = null;
				        Iterator<ImageWriter> it2 = ImageIO.getImageWritersByFormatName("bmp");
				        if(it2.hasNext())
				       {
				             bmpWriter = it2.next();      
				       }
				          bmpWriter.setOutput(fios);
				          BufferedImage br = jpegReader.read(0);
				          bmpWriter.write(br);
				         fiis.close();
				         fios.close();
	


9.FTP上传文件(网上找的例子,感想这个网友的分享^_^ jar包到下面下载)
import java.io.File;
import java.io.FileInputStream;  
import java.io.FileNotFoundException;
import java.io.IOException;  
import java.io.InputStream;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import sun.net.TelnetOutputStream;  
import sun.net.ftp.FtpClient;  
 
public class TestFtpClient {  

	public static void main(String[] args) {
		try { 
			FileInputStream in=new FileInputStream(new File("D:/sb3.bmp")); 
			boolean flag = uploadFile("192.168.0.11", 21, "ctc", "111111", "/home/ctc/", "sb6.bmp", in); 
			System.out.println(flag); 
			} catch (FileNotFoundException e) { 
			e.printStackTrace(); 
			} 

	}
	/**  
	* Description: 向FTP服务器上传文件    
	* @Version1.0 
	* @param url FTP服务器hostname  
	* @param port FTP服务器端口  
	* @param username FTP登录账号  
	* @param password FTP登录密码  
	* @param path FTP服务器保存目录  
	* @param filename 上传到FTP服务器上的文件名  
	* @param input 输入流  
	* @return 成功返回true,否则返回false  
	*/  
	public static boolean uploadFile(String url, int port, String username, String password,   
	    String path, String filename, InputStream input) {   
	  boolean success = false;   
	  FTPClient ftp = new FTPClient();   
	  try {   
	    int reply;   
	    ftp.connect(url, port);// 连接FTP服务器   
	    // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器   
	    ftp.login(username, password);// 登录 
	    ftp.setFileType(FTPClient.BINARY_FILE_TYPE);//设置ftp上传文件的格式,图片失真解决办法!
	    reply = ftp.getReplyCode();   
	    if (!FTPReply.isPositiveCompletion(reply)) {   
	      ftp.disconnect();   
	      return success;   
	    }   
	    ftp.changeWorkingDirectory(path); 	    
	    ftp.storeFile(filename, input);   
	    input.close();   
	    ftp.logout();   
	    success = true;   
	  } catch (IOException e) {   
	    e.printStackTrace();   
	  } finally {   
	    if (ftp.isConnected()) {   
	      try {   
	        ftp.disconnect();   
	      } catch (IOException ioe) {}   
	    }   
	  }   
	  return success;   
	}  

	
}  

10.FTPClient 上传图片失真问题,在登录后ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
ftp.login(username, password);// 登录 
	    ftp.setFileType(FTPClient.BINARY_FILE_TYPE);//设置ftp上传文件的格式,图片失真解决办法!

先写这么多吧,数据库操作也没有什么可写的,还有个ARCGIS地图速度提升问题等我去解决呢,解决不了就不能验收,压力很大,时间紧迫。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics