引言本文是基于Java中的Graphics方法开发的画图工具。开发过程中涉及到窗体按钮画笔等功能对于初学者能很好地激发其求知欲。一窗体创建继上面两期我们的作品我们对于窗体和页面的添加步骤都很熟悉了。让我们快速开始吧。publicclassDrawer{publicvoidli(){JFramejfnewJFrame();jf.setSize(1024,1024);jf.setTitle(画图工具);jf.setDefaultCloseOperation(2);jf.setLocationRelativeTo(null);FlowLayoutflownewFlowLayout();jf.setLayout(flow);jf.setVisible(true);Graphicshjf.getGraphics();//画笔NEWanewNEW();jf.addMouseListener(a);a.th;//important}publicstaticvoidmain(String[]args){DrawerdnewDrawer();d.li();}}如你所见Graphics是在在正常使用的这个没有什么大问题问题是注意这个 的新建要在流式布局的声明之后否则这些画出来的东西会变成乱糟糟的一大团。下面来看看相应的类吧。二画图功能实现——直线首先是接口的实现。这个画笔类继承自一个叫做Mouselistener的接口。很像按钮的Actionlistener但问题是这个接口中一共有5个小方法。起名如下mouseClicked,mousePressed,mouseReleased,mouseEntered,mouseExited.看着像兄弟5人。都一个姓。但是事实上他们很好辨认。当你的鼠标按下即为pressed松开就是releasedclicked即为当你的手在按下的时候不松开鼠标的按键的时候。很简单吧但是问题是我们怎么画出我们想要的呢这里我要解释以下我们的计算机了。画笔这个 类被创建出来时我们的想法就是要如何实现和人画画一样的功能呢电脑与人脑不同它无法理解怎么去画一条直线。所以在直角坐标系中才是他们的“画布”。原点默认是左上角的那个点。于是publicintx1,y1,x2,y2,x3,y3;publicGraphicst;publicvoidmousePressed(MouseEvente){x1e.getX();y1e.getY();}publicvoidmouseReleased(MouseEvente){x2e.getX();y2e.getY();t.drawLine(x1,y1,x2,y2);}到了这里大部分的工作都成功了很简单的一个应用但是我们之后的问题都会建立在这个上面的。三矩形画法有人看完了说这还不简单于是刷刷写了四个drawline。然后要求画n多个矩形他就要写4n条代码。是这样的Java的画笔类方法中有一条是.drawRect().于是刚才的人反应过来好啊你耍我。写了如下代码t.drawRect(x1,y1,x2,y2);可是落笔的时候发现问题了当正常从左上向右下画还好可是反过来就会出现不是和我们的描画的轨迹一样出现的矩形了。刚才说过原点是左上的那个点。这样画完反而会出现x2小于x1的情况y也是同理。那么就是按下的时刻的就好了。后面的也不是y1,y2而是这个矩形的长和宽。用一下Math类中的绝对值方法.abs就好了。这里随便设一下我们进入下一个话题。四三角形等腰上面的教训过后此人表示一定要好好找找看是不是有个专门的方法。可是Java 的画笔类中找来找去也没有该方法。并且等腰三角形前面的名字 太长了。故我们直接利用下坐标点之间的关系就好。t.drawLine((x1x2)/2,y1,x1,y2);t.drawLine((x1x2)/2,y1,x2,y2);t.drawLine(x1,y2,x2,y2);任意此人表示任意还不简单x1x2x3呗于是写完后t.drawLine((x1,y1,x2,y2);t.drawLine((x1,y1,x3,y3);t.drawLine(x3,y3,x2,y2);可是这样我们都不知道那个东西是什么因为x3还没定义并且无济于事x3定义给谁呢这样一来我们只好重新回头想想。哦clicked方法可以用一用啊数组的思想还是好用只要先画一条线再存储一下坐标点然后一把下一次的点击就好了。如果想增加一下健壮性可以直接把按下当作下一次的输入到那时可以更健壮。可是我们还是无法确认是什么这个时候我们能想起上次的东西吗利用switch对了可是再创建类太费劲了。我们还是换一个方法。用if和else。同时让这个类继承那个按钮接口就好了反正一个类可以继承多个接口。进阶——多边形按钮实现了无限多边形呢?我用的是数组ok啊那人比较心急他直接上手建立了一个100长度的数组。可是总有用光库存的时候我们怎么办呢就是不断进行清空和转换不断塞入新的xy再把他们和上一组进行连接然后把他们丢弃就行了反正中间值没有用不用一直存存储第一个按下的地方就行了。思路如上。双击时用到的类自己待会看代码就可以了。ublicclassNEWimplementsMouseListener,ActionListener{publicintx1,y1,x2,y2,x3,y3;publicGraphicst;publicint[]anewint[10];publicint[]bnewint[10];publicinti0,count0;publicStringstr;publicvoidactionPerformed(ActionEvente){stre.getActionCommand();System.out.println(str);}publicvoidmouseClicked(MouseEvente){System.out.println(dian);x3e.getX();y3e.getY();System.out.println(x3:x3);System.out.println(y3:y3);if(str.equals(任意三角形)){if(x3!0y3!0){for(inti0;i4;i){System.out.println(aia[i]);System.out.println(bib[i]);}System.out.println(x1x1);System.out.println(y1y1);System.out.println(x2x2);System.out.println(y2y2);t.drawLine(a[0],b[0],a[2],b[2]);t.drawLine(a[1],b[1],a[2],b[2]);i0;}}if(str.equals(任意多边形)){if(e.getClickCount()1){a[2]x3;b[2]y3;t.drawLine(a[1],b[1],a[2],b[2]);a[1]x3;b[1]y3;}if(e.getClickCount()2){t.drawLine(a[0],b[0],a[1],b[1]);// for (int i0;i10;i){// a[i]0;// b[i]0;// }}}}publicvoidmousePressed(MouseEvente){System.out.println(an);System.out.println(str);x1e.getX();y1e.getY();if(str.equals(任意三角形)){a[i]x1;b[i]y1;i;}if(str.equals(任意多边形)){a[i]x1;b[i]y1;i;}System.out.println(x1:x1);System.out.println(y1:y1);}publicvoidmouseReleased(MouseEvente){System.out.println(str);System.out.println(song);x2e.getX();y2e.getY();if(str.equals(任意三角形)){a[i]x2;b[i]y2;i;t.drawLine(x1,y1,x2,y2);}if(str.equals(任意多边形)i1){a[i]x2;b[i]y2;i;t.drawLine(a[0],b[0],a[1],b[1]);}System.out.println(x2:x2);System.out.println(y2:y2);intwMath.abs(x2-x1);inthMath.abs(y2-y1);intmxMath.min(x1,x2);intmyMath.min(y1,y2);if(str.equals(矩形)){t.drawRect(mx,my,w,h);}if(str.equals(等腰三角形)){t.drawLine((x1x2)/2,y1,x1,y2);t.drawLine((x1x2)/2,y1,x2,y2);t.drawLine(x1,y2,x2,y2);}if(str.equals(直线)){t.drawLine(x1,y1,x2,y2);}}publicvoidmouseEntered(MouseEvente){}publicvoidmouseExited(MouseEvente){}}前面的代码不过就是加入一些小按钮没什么好说的今天就先到这里。