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

本文介绍如何使用Java编程语言,通过矩阵的概念,在图形界面上绘制一个木板。详细解释了如何利用鼠标事件进行图形交互,包括拖动创建矩形形状,并展示了如何在界面上绘制网格线,以及使用AlphaComposite实现图形的透明合成效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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); } } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值