您的位置:首页 > 其它

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

2011-10-06 18:26 176 查看


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);
}
}

}

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