您的位置:首页 > 编程语言 > Java开发

java 简单gis软件 panel paint

2016-03-21 17:49 405 查看


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);//设置选择模式,既可以选择文件又可以选择文件
4000

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: