16. 43. 1. 鼠标拽拖-黑客帝国-画皮Mouse drag and draw

 

import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;

import javax.swing.JComponent;
import javax.swing.JFrame;

//用一个矩阵来画一个木板,有意思吗?  Board:木板 看板    Matrix:矩阵 黑客帝国 点阵  
public class DrawingBoardWithMatrix extends JFrame{
	public DrawingBoardWithMatrix(){//构造一个
		this.setSize(300,300);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.add(new PaintSurface(),BorderLayout.CENTER);//把一个PaintSurface放中间,这是什么东西?往下..
		this.setVisible(true);//surface:中文意思:表面
	}

	public static void main(String[] args) {
		new DrawingBoardWithMatrix();//new一个它,简单吧
	}
	
	private class PaintSurface extends JComponent{//Paint是画画儿,surface是表面,合起来念:画皮!?
		ArrayList<Shape> shapes = new ArrayList<Shape>();//里面装的全是shape:形状
		Point startDrag,endDrag;//两个点,开始拽的点,结束拽的点
		
		private Rectangle2D.Float makeRectangle(int x1, int y1, int x2, int y2) {
		      return new Rectangle2D.Float(Math.min(x1, x2), Math.min(y1, y2), 
		    		  Math.abs(x1 - x2), Math.abs(y1 - y2));
		}

		//==================================================================================
		public PaintSurface(){//俺是一个类,其实是一个JComponent,构造一个呗
			this.addMouseListener(new MouseAdapter(){
				public void mousePressed(MouseEvent e){//鼠标按下....
					startDrag = new Point(e.getX(),e.getY());//你在哪儿点我的startDrag就在哪儿
					endDrag = startDrag;//再把开始的点给结束的点
					repaint();
				}
				public void mouseReleased(MouseEvent e){//鼠标松开
					//有一个形状 r = 做一个方,这里调用了makeRectangle方法
					Shape r = makeRectangle(startDrag.x, startDrag.y, e.getX(), e.getY());
					shapes.add(r);//把make好的r交到shapes里
					startDrag = null;//既然放手了,就把这两个点清除吧
					endDrag = null;
					repaint();
				}
			});
			//鼠标按下与松开都有了,下面是个拽,跩下试试
			this.addMouseMotionListener(new MouseMotionAdapter(){
				public void mouseDragged(MouseEvent e){
					//结束点就是鼠标所在点,意思是你跩到哪儿是哪儿,错了,是拽,跩是用脚 啊
					endDrag = new Point(e.getX(), e.getY());
					repaint();
				}
			});
		}
		//=================================================================================
		
		public void paintBackground(Graphics2D g2){//画背景,这次好猛,直接用2D!
			g2.setPaint(Color.LIGHT_GRAY);//听别人儿说setColor就是setPaint,高亮吧
			for(int i=0; i<getSize().width; i+=10){
				Shape line = new Line2D.Float(i, 0, i, getSize().height);
				g2.draw(line);
			}
			//我要说:这是两个该死for循环,它们其实就是从0开始,每次加10的宽高交替,方格啊!!
			for (int i = 0; i < getSize().height; i += 10) {
		        Shape line = new Line2D.Float(0, i, getSize().width, i);
		        g2.draw(line);
		    }
		}
		//=================================================================================
		public void paint(Graphics g){
			Graphics2D g2 = (Graphics2D)g;//又一个笔,2D的笔!
			//这是一个平滑开关,书上说它会消耗你的内存!
			g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
			paintBackground(g2);//调这个方法
			
			//不知道为什么很多人喜欢黄色!而且本程序运行第一次画出来肯定是黄色!
			Color[] colors = {Color.yellow,Color.magenta,Color.cyan,Color.red,Color.blue,Color.pink};
			int colorIndex = 0;
			
			//Stroke:词典上说它是描边,其它书说它是:一笔,我看它像毛笔
			g2.setStroke(new BasicStroke(2));//线条宽度为2  实心地.....你改成20试试!
			
			/**
			 * AlphaComposite这个东东可以写一本书,它的作用太强了
			 * AlphaComposite 类实现一些基本的 alpha 合成规则,将源色与目标色组合,
			 * 在图形和图像中实现混合和透明效果。此类实现的特定规则是 T. Porter 和 T. Duff 
			 * 合著的 "Compositing Digital Images", SIGGRAPH 84, 253-259 中描述的 12 条基本规则集。
			 * getInstance()具有指定的规则和用来乘源色 alpha 值的常量 alpha 值。
			 * src_over 在目标色之上合成源色(Porter-Duff Source Over Destination 规则)。 
			 * 这句很关键,不然画出来的不会是合成色,而是一个不透明的方块压着另一个不透明的方块
			 */
			g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,0.50f));
			
			//===============================================================
			for(Shape s: shapes){//开始循环取它了啊
				g2.setPaint(Color.black);
				g2.draw(s);//先画方块,黑线的啊
				g2.setPaint(colors[(colorIndex++) % 6]);//这里你看懂否?
				g2.fill(s);//再用我们定义好的颜色来填充它!
			}
			//===============================================================
			
			if(startDrag != null && endDrag != null){//拽的过程中让你能看到它的轨迹!
				g2.setPaint(Color.LIGHT_GRAY);
				Shape r = makeRectangle(startDrag.x, startDrag.y, endDrag.x, endDrag.y);
				g2.draw(r);
			}
		}
		
	}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值