java 簡單gis軟件 panel paint




import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Panel;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Vector;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileNameExtensionFilter;

public class Map extends JFrame implements ActionListener{
      JComboBox jb;
      JMenuBar jmb;
      JButton jm1,jm2,jm3;
      JButton jbs;
      MyPanel mp;
      Panel mp1;
      JFileChooser chooser,chooser1;
      FileFilter filter,filter1;
      BufferedImage bufferedImage=null;
	public static void main(String[] args) {
		// TODO 自動生成的方法存根
          Map mainmap=new Map();
	}

	public Map()
	{
		
		try {
			bufferedImage = ImageIO.read(new File("/河北地圖.jpg"));
		} catch (IOException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		}   
		//jb = newomboBox();
		
		//jb.addItem("南京");
		//jb.addItem("蘇州");
		//jb.addItem("南通");
		//jb.setSelectedItem("南京");	
		chooser = new JFileChooser();
        chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);//設置選擇模式,既可以選擇文件又可以選擇文件夾
        String extj[] = { "jpeg","jpg","bmp","png","gif","tiff"};
        filter = new FileNameExtensionFilter( "Image",extj);
        chooser.setFileFilter(filter);//設置文件後綴過濾器
        chooser.setMultiSelectionEnabled(false);
        
        chooser1 = new JFileChooser();
        chooser1.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);//設置選擇模式,既可以選擇文件又可以選擇文件夾
        String extj1[] = { "txt" };
        filter1 = new FileNameExtensionFilter( "TXT",extj1);
        chooser1.setFileFilter(filter1);//設置文件後綴過濾器
        chooser1.setMultiSelectionEnabled(false);
		
		jbs=new JButton("ssssssssssss");		
		mp=new MyPanel(bufferedImage);	
		jmb=new JMenuBar();
		jm1=new JButton("讀取地圖(R)");
		jm1.addActionListener(this);
		jm1.setActionCommand("readmap");
		jm1.setMnemonic('R');
		jm2=new JButton("獲得座標(G)");
		jm2.addActionListener(this);
		jm2.setActionCommand("readz");
		jm2.setMnemonic('G');
		jm3=new JButton("保存座標(S)");
		jm3.addActionListener(this);
		jm3.setActionCommand("writez");
		jm3.setMnemonic('S');
		jmb.add(jm1);
		jmb.add(jm2);
		jmb.add(jm3);
		this.setJMenuBar(jmb);
		this.add(mp);	
		//jbs.setSize(100,50);
		this.setTitle("河北地圖");
		this.setSize(bufferedImage.getWidth(),bufferedImage.getHeight());		
		this.setLocation(300,280);
		this.setResizable(true);
		this.setMaximumSize(new Dimension(800,600));
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}
	public void paintComponent(Graphics g)
	{		
		if(this.getWidth()>bufferedImage.getWidth())
		   this.setSize(bufferedImage.getWidth(), this.getHeight());
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO 自動生成的方法存根
		int retval;
		 FileWriter fw=null;
		 BufferedWriter bw=null;
		 FileReader fr=null;
		 BufferedReader br=null;
		if(e.getActionCommand().equals("readmap"))
		{
			retval = chooser.showOpenDialog(this);//顯示"保存文件"對話框
            if(retval == JFileChooser.APPROVE_OPTION) {//若成功打開
                File file = chooser.getSelectedFile();//得到選擇的文件名
                //System.out.println("File to open " + file);
                try {
        			bufferedImage = ImageIO.read(file);
        		} catch (IOException e1) {
        			// TODO 自動生成的 catch 塊
        			e1.printStackTrace();
        		}  
                this.remove(mp);
                mp=new MyPanel(bufferedImage);
                this.add(mp);   
                mp.repaint();
                }
		}
		else if(e.getActionCommand().equals("readz"))
		{			
            retval = chooser1.showOpenDialog(this);//
            if(retval == JFileChooser.APPROVE_OPTION) {
            	File file = chooser1.getSelectedFile();
              //  System.out.println("File to save " + file);
                
			try{
				fr=new FileReader(file);
				br=new BufferedReader(fr);
				String s="";				
				Vector<Bq> ls=new Vector<Bq>();
				mp.jb.removeAllItems();
				while((s=br.readLine())!=null)
				{
					String[] sz=s.split(" ");
					Bq b=new Bq();
					b.name=sz[0];
					b.x=Integer.parseInt(sz[1]);
					b.y=Integer.parseInt(sz[2]);
					mp.jb.addItem(b.name);
					ls.add(b);
					//Weizhi wz=new Weizhi(Integer.parseInt(sz[0]),Integer.parseInt(sz[1]),Integer.parseInt(sz[2]));
				//wzjh.add(wz);
				}
				Bq.setLabels(ls);
				mp.ls=Bq.getLabels();
				mp.repaint();
				}catch(Exception e2){}
				finally{
					try{
						br.close();
						fr.close();
					}catch (Exception e2){}
				}
            }
		}
		else if(e.getActionCommand().equals("writez"))
		{
		   File file = new File(this.getTitle()+".txt");
            chooser1.setSelectedFile(file);//設置默認文件名
            retval = chooser1.showSaveDialog(this);//顯示“保存文件”對話框
            if(retval == JFileChooser.APPROVE_OPTION) {
                file = chooser1.getSelectedFile();
               // System.out.println("File to save " + file);
                }
			try{
				fw=new FileWriter(file);
				bw=new BufferedWriter(fw);
				Vector<Bq> ls=Bq.getLabels();
				//bw.write(sdtj+"\r\n");
				for(int i=0;i<ls.size();i++)
				{
					Bq dt=ls.get(i);					
						String zb=dt.name+" "+dt.x+" "+dt.y+"";
						bw.write(zb+"\r\n");					
				}
			}catch(Exception e3){}
				finally{
					try{
						bw.close();
						fw.close();
					}catch(Exception e3){}
				}
		}
	}
	

}
class MyPanel extends JPanel implements MouseMotionListener,MouseListener,KeyListener,MouseWheelListener, ItemListener{

	int fl=0,fl1=0,fl2=0,fl3=0,fl4=0;//fl用來確定鼠標左鍵移動,fl1判斷是不是處於編輯狀態,fl2判斷是右鍵拖拽,fl3確定在更改combox選項的時候不觸發選擇事件,fl4決定框選後是否重繪某些控件
	JLabel bilichi;
	JComboBox jb;
	JButton jbs,jbs1;
	JTextField jtf;
	Vector<Bq> ls;
	//默認選中南京}
	float size=1;
	Point point=new Point(0,0);
	Point oldpoint=new Point(0,0);
	Point newpoint=new Point(0,0);
	BufferedImage imag;
	Image image;
	public MyPanel(BufferedImage bufferedImage) {
		// TODO 自動生成的構造函數存根
		imag=bufferedImage;
		image=(Image)imag;
		this.setLayout(null);
		jb = new JComboBox();	
		//Vector<Bq> ls=Bq.getLabels();
		jb.setSize(100, 20);
		ls=Bq.getLabels();
		if(ls.size()>0){
			jb.removeAllItems();
			for(int i=0;i<ls.size();i++)
			{
				Bq b=ls.get(i);
				jb.addItem(b.name);
			}
			jb.setSelectedIndex(0);				
			}
		jb.addItemListener(this);
		this.add(jb);
		bilichi=new JLabel("比例尺  1:1");	
		//bilichi.setLocation(100, 100);
		//bilichi.setSize(200, 40);
		//this.add(bilichi);
	//jb.addItem("南京");
	//jb.addItem("蘇州");
	//jb.addItem("南通");
	//jb.setSelectedItem("南京");
	jbs=new JButton("ssssssssss");	
	jbs1=new JButton("ddddddd");
	//this.add(jb);
	
		this.setSize(imag.getWidth(),imag.getHeight());
		this.addMouseListener(this);
		this.addMouseWheelListener(this);
		this.addMouseMotionListener(this);
		this.addKeyListener(this);
	}
	
	@Override
	public void mouseDragged(MouseEvent e) {
		// TODO 自動生成的方法存根
		if(fl==1&&fl1==0)
		{
		newpoint.x=e.getX();
		newpoint.y=e.getY();
		point.x=point.x+(newpoint.x-oldpoint.x);
		point.y=point.y+(newpoint.y-oldpoint.y);
		oldpoint.x=newpoint.x;
		oldpoint.y=newpoint.y;
        this.repaint();             
		}
		else if(fl2==1&&fl1==0)
		{
			newpoint.x=e.getX();
			newpoint.y=e.getY();
			this.repaint();
		}
	}
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);		
		if(fl4==0)
		{
		if(fl1==0)
			{
			for(int i=0;i<this.getComponentCount();i++)
			{
			    Object ob=this.getComponent(i);
			    if(!(ob instanceof JComboBox))
			    {
			    	this.remove(i);
			    }
			}	
			
			}
		}
		g.clearRect(0, 0, this.getWidth(), this.getHeight());
		/*
		if(point.x<-(imag.getWidth()-this.getWidth()))
			point.x=-(imag.getWidth()-this.getWidth());		
		if(point.x>imag.getWidth()-this.getWidth())
			point.x=imag.getWidth()-this.getWidth();		
		if(point.y<-(imag.getHeight()-this.getHeight()))
			point.y=-(imag.getHeight()-this.getHeight());
		if(point.y>0)
			point.y=0;		*/
		g.drawImage(image, point.x, point.y,(int)(imag.getWidth()*size),(int)(imag.getHeight()*size),this);
		if(fl4==0)
		{
		if(fl2==1)
			g.drawRect(oldpoint.x<newpoint.x?oldpoint.x:newpoint.x, oldpoint.y<newpoint.y?oldpoint.y:newpoint.y, newpoint.x>oldpoint.x?newpoint.x-oldpoint.x:oldpoint.x-newpoint.x, newpoint.y>oldpoint.y?newpoint.y-oldpoint.y:oldpoint.y-newpoint.y);
		jbs.setLocation(point);
		jbs1.setLocation((int)(point.x+(500*size)),(int)(point.y+(500*size)));
		//jb.setLocation((int)(0-this.getLocation().getX()),(int)(0-this.getLocation().getY()));
		//this.add(jb);
		jbs1.setSize((int)(100*size),(int)(30*size));
		jbs.setSize((int)(100*size),(int)(30*size));
		//this.add(jbs);
		//Vector<Bq> ls=Bq.getLabels();
		//for(int i=0;i<ls)
				
		//this.add(jbs1);
		ls=Bq.getLabels();		 
		for(int i=0;i<ls.size();i++)
		{			
			Bq bq=ls.get(i);
			JLabel jl=new JLabel(bq.name);
			jl.setLocation((int)(point.x+(bq.x*size)),(int)(point.y+(bq.y*size)));
			jl.setSize((int)(70*size),(int)( 20*size));				
			this.add(jl);
		}	
		//bilichi=new JLabel("比例尺——1:1");
		bilichi.setLocation(0, 20);
		bilichi.setSize(200,40);
		this.add(bilichi);		
		}		
		if(fl4==1) this.requestFocus();//如果不重新獲取焦點panel會不觸發按鍵事件
		fl4=0;
		
	}
	@Override
	public void mouseMoved(MouseEvent e) {
		// TODO 自動生成的方法存根
		
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		// TODO 自動生成的方法存根
		if(e.getButton()==MouseEvent.BUTTON3&&fl1==0)
		{
			jtf=new JTextField();
			jtf.setLocation(e.getX(),e.getY());
			jtf.setSize(50, 30);			
			jtf.addKeyListener(this);
			this.add(jtf);
			fl1=1;			
			this.repaint();
		}
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO 自動生成的方法存根
		for(int k=0;k<this.getComponentCount();k++)
		{
		    Object ob=this.getComponent(k);
		    if(ob instanceof JLabel)
		    {
		    	JLabel ii=(JLabel)ob;
		    	
		    		ii.setOpaque(false);
		    		ii.setBackground(Color.white);
		    	
		    	//this.remove(i);
		    }
		}	
		if(e.getButton()==MouseEvent.BUTTON1)
		{
		this.oldpoint.x=e.getX();
		this.oldpoint.y=e.getY();
		fl=1;
		}
		else if(e.getButton()==MouseEvent.BUTTON3)
		{
			this.oldpoint.x=e.getX();
			this.oldpoint.y=e.getY();
			this.newpoint.x=e.getX();
			this.newpoint.y=e.getY();
			fl2=1;		
			fl3=1;
		}
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO 自動生成的方法存根
		fl=0;
		if(fl2==1)
		{			
		 ls=Bq.getLabels();
		 int sum=ls.size();
			for(int i=0;i<sum;i++)
			{
				//ls=Bq.getLabels();
				//sum=ls.size();
				Bq b=ls.get(i);
				if(oldpoint.x<newpoint.x)
				{
					if(oldpoint.y<newpoint.y)
					{
						if(b.x*size>oldpoint.x-point.x&&b.x*size<newpoint.x-point.x&&b.y*size>oldpoint.y-point.y&&b.y*size<newpoint.y-point.y)
						{
							/*for(int j=0;j<jb.getItemCount();j++)
							{
								if(jb.getItemAt(j).toString().equals(b.name))
									jb.removeItemAt(j);
							}
							ls.remove(b);							
							Bq.setLabels(ls);
							sum=ls.size();
							i=-1;*/
							for(int k=0;k<this.getComponentCount();k++)
							{
							    Object ob=this.getComponent(k);
							    if(ob instanceof JLabel)
							    {
							    	JLabel ii=(JLabel)ob;
							    	if(ii.getText().equals(b.name))
							    	{
							    		ii.setOpaque(true);
							    		ii.setBackground(Color.blue);
							    	}
							    	//this.remove(i);
							    }
							}	
							fl4=1;
						}
					}else {
						if(b.x*size>oldpoint.x-point.x&&b.x*size<newpoint.x-point.x&&b.y*size<oldpoint.y-point.y&&b.y*size>newpoint.y-point.y)
						{
							/*for(int j=0;j<jb.getItemCount();j++)
							{
								if(jb.getItemAt(j).toString().equals(b.name))
									jb.removeItemAt(j);
							}
							ls.remove(b);
							Bq.setLabels(ls);
							sum=ls.size();
							i=-1;		*/	
							for(int k=0;k<this.getComponentCount();k++)
							{
							    Object ob=this.getComponent(k);
							    if(ob instanceof JLabel)
							    {
							    	JLabel ii=(JLabel)ob;
							    	if(ii.getText().equals(b.name))
							    	{
							    		ii.setOpaque(true);
							    		ii.setBackground(Color.blue);
							    	}
							    	//this.remove(i);
							    }
							}	
							fl4=1;
						}
					}
				}else{
					if(oldpoint.y<newpoint.y)
					{
						if(b.x*size<oldpoint.x-point.x&&b.x*size>newpoint.x-point.x&&b.y*size>oldpoint.y-point.y&&b.y*size<newpoint.y-point.y)
						{
							/*for(int j=0;j<jb.getItemCount();j++)
							{
								if(jb.getItemAt(j).toString().equals(b.name))
									jb.removeItemAt(j);
							}
							ls.remove(b);
							Bq.setLabels(ls);
							sum=ls.size();
							i=-1;*/
							for(int k=0;k<this.getComponentCount();k++)
							{
							    Object ob=this.getComponent(k);
							    if(ob instanceof JLabel)
							    {
							    	JLabel ii=(JLabel)ob;
							    	if(ii.getText().equals(b.name))
							    	{
							    		ii.setOpaque(true);
							    		ii.setBackground(Color.blue);
							    	}
							    	//this.remove(i);
							    }
							}	
							fl4=1;
							}
					}else {
						if(b.x*size<oldpoint.x-point.x&&b.x*size>newpoint.x-point.x&&b.y*size<oldpoint.y-point.y&&b.y*size>newpoint.y-point.y)
						{
							/*for(int j=0;j<jb.getItemCount();j++)
							{
								if(jb.getItemAt(j).toString().equals(b.name))
									jb.removeItemAt(j);
							}
							ls.remove(b);
							Bq.setLabels(ls);
							sum=ls.size();
							i=-1;*/	
							for(int k=0;k<this.getComponentCount();k++)
							{
							    Object ob=this.getComponent(k);
							    if(ob instanceof JLabel)
							    {
							    	JLabel ii=(JLabel)ob;
							    	if(ii.getText().equals(b.name))
							    	{
							    		ii.setOpaque(true);
							    		ii.setBackground(Color.blue);
							    	}
							    	//this.remove(i);
							    }
							}	
							fl4=1;
						}
					}
				}
			}
		}		
		fl1=0;
		fl2=0;
		fl3=0;
		this.repaint();		
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO 自動生成的方法存根
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO 自動生成的方法存根
		
	}

	@Override
	public void mouseWheelMoved(MouseWheelEvent e) {
		// TODO 自動生成的方法存根
		if(e.getWheelRotation()==-1)
		{
			if(size<=4)
			size+=0.01;
			bilichi.setText("比例尺  1:"+1/size);
		}
		if(e.getWheelRotation()==1)
		{
			if(size>0)
			size-=0.01;
			bilichi.setText("比例尺  1:"+1/size);
		}
		this.repaint(); 
	}

	@Override
	public void keyTyped(KeyEvent e) {
		// TODO 自動生成的方法存根
		
	}

	@Override
	public void keyPressed(KeyEvent e) {
		// TODO 自動生成的方法存根
		if(e.getKeyCode()==KeyEvent.VK_ENTER)
		{
			int ishave=0;
			ls=Bq.getLabels();
		    for(int i=0;i<ls.size();i++)
		    {
			Bq jl=new Bq();
			jl=ls.get(i);
			if(jtf.getText().replace(" ","").equals(jl.name))
				ishave=1;
		    }
		    if(ishave==0)
		    {
		    	Bq jl=new Bq();
			jl.name=jtf.getText().replace(" ","");
			 jl.x=(int)((jtf.getLocation().x-point.x)/size);
			 jl.y=(int)((jtf.getLocation().y-point.y)/size);
			 jb.addItem(jl.name);			 
			 ls.add(jl);
			 Bq.setLabels(ls);			 
		    }
		    jtf.removeKeyListener(this);
			 this.remove(jtf);			 
			 //this.add(jl);
			 fl1=0;	
			 
			 this.repaint();
		}
		else if(e.getKeyCode()==KeyEvent.VK_ESCAPE)
		{
			 jtf.removeKeyListener(this);
			this.remove(jtf);
			fl1=0;			
			this.repaint();
		}
		else if(e.getKeyCode()==KeyEvent.VK_DELETE)
		{
			int sum=this.getComponentCount();
			for(int k=0;k<sum;k++)
			{
			    Object ob=this.getComponent(k);
			    if(ob instanceof JLabel)
			    {
			    	JLabel ii=(JLabel)ob;
			    	if(ii.getBackground()==Color.blue&&ii.isOpaque())
			    	{
			    		for(int j=0;j<jb.getItemCount();j++)
						{
							if(jb.getItemAt(j).toString().equals(ii.getText()))
								jb.removeItemAt(j);
						}
			    	
			    	ls=Bq.getLabels();
			    	for(int i=0;i<ls.size();i++)
			    	{
			    		Bq b=ls.get(i);
			    		if(b.name.equals(ii.getText()))
			    			{ls.remove(i);
			    			Bq.setLabels(ls);
			    			}
			    	}
			    	//k--;
			    	//sum=this.getComponentCount();
			    	}
			    	//this.remove(i);
			    }
			}	
			
			fl4=0;
			fl1=0;
			this.repaint();
		}
	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO 自動生成的方法存根
		
	}

	@Override
	public void itemStateChanged(ItemEvent e) {
		// TODO 自動生成的方法存根
		if(fl3==0)
		{
		if (e.getStateChange()==ItemEvent.SELECTED)
		{
	   	  	  String ss=jb.getSelectedItem().toString();
	   	  	  Vector<Bq> ls=Bq.getLabels();
	   	  	  for(int i=0;i<ls.size();i++)
	   	  	  {
	   	  		  Bq b=ls.get(i);
	   	  		  if(b.name.equals(ss))
	   	  		  {
	   	  			  point.x=(int)((this.getWidth()/2)-(b.x*size));
	   	  			  point.y=(int)((this.getHeight()/2)-(b.y*size));
	   	  			  this.repaint();
	   	  		  }
	   	  	  }
	   	  	  }
		}
	}	
}
class Bq
{
	int x,y;
	String name;
	static Vector<Bq> labels=new Vector<Bq>();
	public static Vector<Bq> getLabels() {
		return Bq.labels;
	}
	public static void setLabels(Vector<Bq> labels) {
		Bq.labels = labels;
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章