swing编程练习----操作几何图形

import java.util.ArrayList;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;

public class TypeGame extends JFrame{
	public TypeGame(){
		initComponent();
	}
	private void initComponent(){
		//居中显示
		Toolkit kit = Toolkit.getDefaultToolkit();
		int windowWidth   = kit.getScreenSize().width;
		int windowHeight  = kit.getScreenSize().height;
		setBounds((windowWidth-fameWidth)/2,(windowHeight-fameHeight)/2,fameWidth,fameHeight);
		
		add(new MyCanvas());
	}
	private class MyCanvas extends JComponent{
		public MyCanvas(){
			addMouseListener(new MouseHandler());
			addMouseMotionListener(new MouseMotionHandler());
			list = new ArrayList<Rectangle2D>();
		}
		public void paintComponent(Graphics g){
			Graphics2D g2 = (Graphics2D)g;
			for(Rectangle2D rect : list){
				g2.draw(rect);
			}
		}
		public void add(Rectangle2D rect){
			list.add(rect);
			repaint();
		}
		public void remove(Rectangle2D rect){
			if(rect==null) return;
			list.remove(rect);
			repaint();
		}
		public Rectangle2D find(Point point){
			for(Rectangle2D rect : list){
				if(rect.contains(point)){
					return rect;
				}
			}
			return null;
		}

		private class MouseHandler extends MouseAdapter{
			private Point start;

			public void mousePressed(MouseEvent evt){
				this.start = (find(evt.getPoint()) == null)?evt.getPoint():null;
			}
			public void mouseReleased(MouseEvent evt){
				if(start == null||start.equals(evt.getPoint())) return;
				Rectangle2D rect = new Rectangle2D.Float((float)(start.getX()<evt.getX()?start.getX():evt.getX()),(float)(start.getY()<evt.getY()?start.getY():evt.getY()),(float)Math.abs(evt.getX()-start.getX()),(float)Math.abs(evt.getY()-start.getY()));
				add(rect);
			}
			public void mouseClicked(MouseEvent evt){
				if(evt.getClickCount()>=2){
					setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
					Rectangle2D rect = find(evt.getPoint());
					if(rect!=null){
						remove(rect);
						setCursor(Cursor.getDefaultCursor());
						return;
					}
				}
			}
		}
		private class MouseMotionHandler extends MouseMotionAdapter{
			private Rectangle2D rect = null;
			private Point currentPoint = null;

			public void mouseMoved(MouseEvent evt){
				Rectangle2D rectTemp = find(evt.getPoint());
				if(rectTemp!=null){
					rect = rectTemp;
					currentPoint = evt.getPoint();
					setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
				}else{
					rect = null;
					currentPoint = null;
					setCursor(Cursor.getDefaultCursor());
				}
			}
			public void mouseDragged(MouseEvent evt){
				if(rect!=null){
					Point point = evt.getPoint();
					double x = currentPoint.getX()-point.getX();
					double y = currentPoint.getY()-point.getY();
					Rectangle2D rectAdd = new Rectangle.Double(rect.getX()-x,rect.getY()-y,rect.getWidth(),rect.getHeight());
					remove(rect);
					add(rectAdd);
					rect = rectAdd;
					currentPoint = evt.getPoint();
				}
			}
		}
	}
	public static void main(String[] args){
		EventQueue.invokeLater(new Runnable(){
			public void run(){
				TypeGame game = new TypeGame();
				game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				game.setVisible(true);
				//初始化感官
				UIManager.LookAndFeelInfo[] infos = UIManager.getInstalledLookAndFeels();
				try{
					UIManager.setLookAndFeel(infos[1].getClassName());
				}catch(Exception e){
					e.printStackTrace();
				}
					SwingUtilities.updateComponentTreeUI(game);
				}
		});
	}
	private int fameWidth  = 500;
	private int fameHeight = 400;
	private java.util.List<Rectangle2D> list = null;
}

你可能感兴趣的:(swing)