当前位置:编程学习 > JAVA >>

Swing鼠标拽拖-黑客帝国-画皮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);  
            }  
        }  
          
    }  
  
}  
--------------------编程问答-------------------- 散分? --------------------编程问答-------------------- 怎么就看不懂你想表达什么呢?还是我看黑客帝国看少了,黑客帝国和画皮什么时候联姻了? --------------------编程问答-------------------- --------------------编程问答-------------------- 从头看说明,画皮等什么纯属直译玩笑。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,