16. 43. 1. 鼠标拽拖-黑客帝国-画皮Mouse drag and draw
2011-10-06 18:26
176 查看
![](http://hi.csdn.net/attachment/201110/6/0_1317896884nv77.gif)
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); } } } }
相关文章推荐
- 16. 3. 11. 剪切渐变合成及鼠标移动Translate and rotate all objects
- 16. 3. 12. 鼠标拖拽及滑轮图形Move and scale graphical objects with a mouse on the panel
- javascript+div实现鼠标划过,切换层效果
- 【Visual C++】游戏开发笔记十三 游戏输入消息处理(二) 鼠标消息处理
- marquee标签滚动刷新导致鼠标光标闪动很快的解决办法
- 设置鼠标移进后以及鼠标点击后的JButton的背景图片
- 解决slideDown()、slideUp()执行结束后才执行下一次,导致鼠标离开后很久动画依然在执行的问题
- css动画 鼠标浮上 图片变大, 遮罩层下来
- 看完了黑客帝国
- Excel不能鼠标拖动进行顺序编号,弹出文本框对象
- asp.net 禁止粘贴 禁止鼠标右键 只能输入中文、英文、数字、@符号和.符号 只能输入数字 只能输入汉字 文本框只能输入数字代码(小数点也不能输入)
- html title换行方法 如a链接标签内title属性鼠标悬停提示内容换行
- jQuery事件-鼠标事件
- LeetCode16. 3sum closet
- (4):Silverlight 2 鼠标事件处理
- 43.自定义异常处理类
- Unity中鼠标左键按下,拖拽物体移动
- 如何实现鼠标放在图片上出现文字说明效果?
- html title换行方法 如a链接标签内title属性鼠标悬停提示内容换行
- 【python+selenium】pyautogui库和鼠标操作介绍