1.Hello,大家好,这是我的第二篇博客,写的是如何创作一个画图板;因为我以前写的代码都是用dev-C++写的控制台程序,这次学习了JFrame等容器,就想写个画图工具练练手,这一篇我讲的可能会细碎一点。首先我们要做一个可视化界面,用JFrame类即可,JFrame是一个窗体类,就是我们平时见到的窗体框架,当我们实例化一个JFrame对象时,相当于就是创造了一个窗体,具体的窗体实现我就不在这里详述了,可以看其他博客或者私我。要做一个画图板,首先要做一个窗体,代码如下:
packagePaint_10_28;importjavax.swing.*;publicclassTest_Paint{publicstaticvoidmain(String[]args){//创建窗体JFramejfnewJFrame();//设置窗体名字jf.setTitle("画图板");//设置窗体大小jf.setSize(600,600);//设置窗体居中jf.setLocationRelativeTo(null);//设置窗体可见jf.setVisible(true);//设置默认关闭形式jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}2.至此,我们即已经做好了一个简单的窗体程序,接下来我们要在窗体上添加各种功能,比如画画功能,比如重绘功能(后面会详细介绍),比如改变画笔颜色,比如画各种图形,比如清除画板等等。
3.实现画画功能:我们要实现画画第一点要想到的是,假设我们要画一条直线,一般是按紧鼠标拖动一段距离,松开鼠标的时候直线便会从起点处画到终点处,我们是不是需要一个鼠标的监听事件呢,对了,就是要监听鼠标的动作,那就需要将JFrame调用addMouselistener,然鹅addMouseListener方法需要一个MouseListener对象作参数,问题又来了,这个MouseListener是一个接口,无法直接实例化对象(详情可参照上一篇博客),这个我们可以新建一个监听的类,在Buttonlistener类中我们实现MouseListener接口,这样子就可以实现对鼠标的监听了(当然要记得重写接口中的方法喔)第二点要想到的是,如何获取一个画笔来画出图形。在Java中,有一个画笔类,我们只需要实例化画笔对象即可,而画笔对象不是new出来的,我们需要用一个JFrame或者JPanel对象来获取。形如:JFramejfnewJFrame();//创建窗体对象Graphicsgfjf.getGraphics();//通过窗体对象来获得一个画笔上代码
packagePaint_10_28;importjava.awt.event.*;importjavax.swing.JPanel;publicclassButtonListenerimplementsActionListener,MouseListener,MouseMotionListener{privateJPaneljp;privateGraphicsgr;intx10,y10,x20,y20;//Override鼠标监听//点击publicvoidmouseClicked(MouseEvente){}@Override//按下publicvoidmousePressed(MouseEvente){//鼠标按下的时候,分别获取起点的横纵坐标x1e.getX();y1e.getY();}@Override//松开publicvoidmouseReleased(MouseEvente){//TODOAuto-generatedmethodstub//鼠标松开的时候,分别获取终点的横纵坐标x2e.getX();y2e.getY();gr.drawLine(x1,y1,x2,y2);//通过drawLine方法在两个点之间连一条直线(gr是画笔)}@Override//进入publicvoidmouseEntered(MouseEvente){//TODOAuto-generatedmethodstub}@Override//移出publicvoidmouseExited(MouseEvente){//TODOAuto-generatedmethodstub}4.前面我们讲述了如何生成窗体并让鼠标画线,但是我们的画笔一直是现成的,要生成一个画笔我们用如下代码
JPaneljpnewJPanel();Graphicsgfjp.getGraphics();5.有了窗体,鼠标监听和画笔,我们就可以画图了,效果图如下大家刚刚看到我的效果图上面有很多按钮可以控制画不同的线,其实是我添加了很多按钮在面板上面,前面讲过添加MouseListener,如果要用到按钮的话,就要用某个按钮addActionListener,这样子按钮就可以监听到我们的行动,伪代码如下:
JBuutonjbnewJButton("直线");/*大家看到下面的函数中用了ActionListener的对象,但是这是个接口,不能实例化对象,因此实际的代码中要用他子类的对象才可以,在这里是伪代码就不细说了,当然还涉及到接口方法的重写,这个上一篇博客有写*/jb.addActionListener(ActionListenere)6.有了按钮之后,我们就可以通过按钮来设定不同的线条和画笔颜色,这些多种功能可以自己后期去实现,讲到现在为止,我们的画板已经可以画直线了,实现到这一步,我们发现如果把窗体拉大或者缩小,或者将窗口最小化再最大化画板上的内容会消失画板的内容消失这不是我们所期待的,我们要怎么处理呢,这里就涉及到窗体的重绘机制,其实我们的窗体在发生大小变化时,会默认自动调用一个函数叫做paint(),如果我们要想自己画的东西不消失,就要重写paint方法,让他在重绘窗体的时候把我们的图形也画进去,那么一个最简单的想法,我们可以建立一个数组,将我们所有绘画的图案存进去然后在调用paint方法的时候,我们除了绘画窗体还要用一个for循环,将数组内部的图案取出来,画在画板上。伪代码如下:
publicvoidpaint(Graphicsg){//调用super.paint(),因为要先画出窗体,再重绘我们的图案super.paint(g);lenbtl.get_len();for(inti0;ilen;i++){如果数组元素不为空,就可以重绘出图案if(ShArr[i]!null){///////////重写绘画图像,调用repaint方法ShArr[i].repaint(g);}else{break;}}}//这里是上面调用的repaint方法publicvoidrepaint(Graphicsg){//在这里进行g.drawLine(x1,y1,x2,y2);}7.这样子过来,我们就已经基本上实现了1.构建窗体2.添加鼠标监听3.获取画笔画图案4.添加按钮监听用来控制画板5.添加重绘机制,让图案不消失上面的所有代码都是伪代码,合起来并不能实现一个真正的画板,下面上源代码敲黑板,需要源代码的自取喔,总共三个文件Shape类,能存放不同的图案
packagePaint_10_28;importjava.awt.Graphics;importjavax.swing.JPanel;//定义一个图案的类,方便对多种图案进行实现和管理publicclassShape{//Shape类有name和两点坐标的属性privateintx1,x2,y1,y2;privateStringname;publicShape(intx1,inty1,intx2,inty2,Stringname){this.x1x1;this.x2x2;this.y1y1;this.y2y2;this.namename;}//根据不同的图案名字,开展不同的重绘机制publicvoidrepaint(Graphicsg){switch(name){case"直线":g.drawLine(x1,y1,x2,y2);break;case"矩形":g.drawRect(Math.min(x1,x2),Math.min(y1,y2),Math.abs(x1-x2),Math.abs(y1-y2));break;case"圆形":g.drawOval(Math.min(x1,x2),Math.min(y1,y2),Math.abs(x1-x2),Math.abs(y1-y2));break;case"曲线":g.drawLine(x1,y1,x2,y2);break;case"多边形":g.drawLine(x1,y1,x2,y2);break;}}}8.ButtonListener类,监听类,继承了多个接口,可以实现多种监听
packagePaint_10_28;importjava.awt.event.*;importjavax.swing.JButton;importjavax.swing.JPanel;publicclassButtonListenerimplementsActionListener,MouseListener,MouseMotionListener{privateintindex0;privateShapeShArr[];privateJPaneljp;privatejava.awt.Graphicsgr;privateStringzhiling"";intx00,y00,x10,y10,x20,y20,x30,x40,y30,y40,start_x0,start_y0;publicvoidset_jp(JPaneljp){this.jpjp;}publicvoidset_gr(java.awt.GraphicsG){this.grG;}publicvoidset_ShArr(ShapeShArr[]){this.ShArrShArr;}publicintget_len(){returnindex;}publicvoidactionPerformed(ActionEvente){//TODOAuto-generatedmethodstubx1200;y1200;if(e.getActionCommand()""){JButtonj(JButton)e.getSource();gr.setColor(j.getBackground());}else{zhilinge.getActionCommand();if("清除".equals(zhiling)){//System.out.println("这里是buttonlistener的清除");index0;//p.set_len(len);jp.repaint();x40;y40;}}}//鼠标拖动时间,用来绘画曲线publicvoidmouseDragged(MouseEvente){//System.out.println("Drag");if("曲线".equals(zhiling)){x1x0;y1y0;x0e.getX();y0e.getY();gr.drawLine(x1,y1,x0,y0);ShArr[index++]newShape(x1,y1,x0,y0,zhiling);}}//Override鼠标监听//点击鼠标点击时间,用来绘画多边形publicvoidmouseClicked(MouseEvente){//TODOAuto-generatedmethodstubif("多边形".equals(zhiling)){if(x40y40){x4e.getX();y4e.getY();start_xx4;start_yy4;//gr.drawLine(x3,y3,x4,y4);}else{//System.out.println("Hereisduobianxing");x3x4;y3y4;x4e.getX();y4e.getY();gr.drawLine(x3,y3,x4,y4);ShArr[index++]newShape(x3,y3,x4,y4,zhiling);}if(e.getClickCount()2){//System.out.println("双击");//System.out.println("双击");x40;y40;gr.drawLine(start_x,start_y,e.getX(),e.getY());ShArr[index++]newShape(start_x,start_y,e.getX(),e.getY(),zhiling);}}}//当鼠标按下的时候,获取起点的坐标@Override//按下publicvoidmousePressed(MouseEvente){//System.out.println("按下");if("曲线".equals(zhiling)){x0e.getX();y0e.getY();}//TODOAuto-generatedmethodstubx1e.getX();y1e.getY();}//当鼠标松开的时候,获取终点的坐标@Override//松开publicvoidmouseReleased(MouseEvente){//TODOAuto-generatedmethodstubx2e.getX();y2e.getY();//System.out.println("松开");if("直线".equals(zhiling)){gr.drawLine(x1,y1,x2,y2);ShArr[index++]newShape(x1,y1,x2,y2,zhiling);//System.out.println("长度是"+len);}elseif("矩形".equals(zhiling)){gr.drawRect(Math.min(x1,x2),Math.min(y1,y2),Math.abs(x1-x2),Math.abs(y1-y2));ShArr[index++]newShape(x1,y1,x2,y2,zhiling);}elseif("圆形".equals(zhiling)){gr.drawOval(Math.min(x1,x2),Math.min(y1,y2),Math.abs(x1-x2),Math.abs(y1-y2));ShArr[index++]newShape(x1,y1,x2,y2,zhiling);}}//剩下的方法,可以暂时不用管@Override//进入publicvoidmouseEntered(MouseEvente){//TODOAuto-generatedmethodstub}@Override//移出publicvoidmouseExited(MouseEvente){//TODOAuto-generatedmethodstub}publicvoidmouseMoved(MouseEvente){}}9.paint类,主函数所在的类,里面实例化了窗体对象,重写了paint方法
packagePaint_10_28;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassPaintextendsJPanel{//建立一个很大的数组,用来存放图形元素privateShape[]ShArrnewShape[10000];publicstaticvoidmain(String[]args){PaintpnewPaint();}JFramejfnewJFrame();//JPaneljpnewJPanel();intlen0;//实例化一个ButtonListener对象,实现了多种接口ButtonListenerbtlnewButtonListener();publicPaint(){//实现一个窗体jf.setTitle("画图板");jf.setLocation(450,100);jf.setSize(700,600);this.setPreferredSize(newDimension(600,500));//声明两个数组,包含各种指令String[]command{"开始","清除","直线","曲线","多边形","矩形","圆形"};Color[]color{Color.BLACK,Color.BLUE,Color.YELLOW,Color.RED,Color.GREEN};//设置布局为流式布局jf.setLayout(newFlowLayout());/*在下面的两个循环中将各种按钮添加进入动作监听器中,其中addActionListener参数为btl,btl是一个Buttonlistener的对象*/for(inti0;icommand.length;i++){JButtonjbnewJButton(command[i]);jb.addActionListener(btl);jf.add(jb);}for(inticolor.length-1;i0;i--){JButtonjbnewJButton();jb.setBackground(color[i]);//设置背景颜色DimensiondmnewDimension(20,20);//设置大小jb.setPreferredSize(dm);jb.addActionListener(btl);jf.add(jb);}//将JPanel对象添加进入jf窗体对象中,让他生效jf.add(this);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.setVisible(true);//设置可见Graphicsgfthis.getGraphics();//获取画笔,我们的this代表当前类的对象,正好是一个JPanel的对象this.addMouseListener(btl);//添加鼠标监听器,用于画图this.addMouseMotionListener(btl);//添加鼠标模式监听器,用于绘画曲线btl.set_gr(gf);//设置另外一个类的画笔btl.set_jp(this);//设置另外一个类的JPanel容器btl.set_ShArr(ShArr);//设置另外一个类的数组}publicvoidpaint(Graphicsg){super.paint(g);//调用父类的paint方法,用来画出窗体lenbtl.get_len();//获取数组的长度//重绘我们的图案for(inti0;ilen;i++){if(ShArr[i]!null){//重写绘画图像,但是我只重绘了图形,忘记加颜色了;ShArr[i].repaint(g);}else{break;}}}}10.这三个类是画图板的主要组成部分,需要的同学可以自取。画图板中间许多比较复杂的功能我并没有解释的很清楚,只是给出了一个大体的思路,对源代码有疑问的可以mail【1124397151@qq.com】这个画图板搞了我三天时间,通过这画图板我对各种监听和继承有了更深的理解,另外一点重要的理解是,Java中不同的类之间不方便共享数据,但是他可以共享类的对象,因此我们要共享数据可以通过将某个类的对象当做参数传递过去,然后通过getxxx()方法来获取那个类中的某个数据,在这个画图板中,图案数组的长度我就是这样处理的。最后效果图如下/写的比较糙,有什么疑问的可以发邮件给我,欢迎大家批评指正***/
用java写一个简单的画图板-java画图板程序-java小程序设计
浏览量:1827
时间:
来源:hnu_Cheng
版权声明
即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

最新资讯
-
抖音再现本地生活服务,咫尺同城圈商业变现新通道
短视频成为本地生活探店网红营销变现引流的新阵地,每一位网红都渴望在短视频内“一夜爆红”。即速应用团队对多商家小程序进行升级,打造了咫尺同城圈:“同城探店营销助手”,不仅完善商家营销技巧,还助力探店网红玩转本地生活服务。 -
抖音再现本地生活服务,咫尺同城圈商业变现新通道
短视频成为本地生活探店网红营销变现引流的新阵地,每一位网红都渴望在短视频内“一夜爆红”。即速应用团队对多商家小程序进行升级,打造了咫尺同城圈:“同城探店营销助手”,不仅完善商家营销技巧,还助力探店网红玩转本地生活服务。 -
阿坝小程序代理
阿坝藏族羌族小程序代理公司有哪些?阿坝藏族羌族小程序代理平台哪个好?阿坝藏族羌族小程序代理商怎么收费,代理政策如何?下面就让即速应用产品经理jisuapp.cn来告诉你吧!