学习java这门编程语言也有一个多月了。~若是能用本身学的编程语言去开发一些小程序软件能够说是本身一直求之不得吧!。模仿XP的画图板的开发则是学java来最先作的一个小软件。也是把以前学到的不少知识得意联系而且掌握熟练运用的一个过程吧!java

先让你们看看弄到如今这个画图板的样子吧:编程

这个画板如今能够实现的功能包括话各类图形、铅笔、喷漆、刷子、橡皮、吸管取色这些。下面就来一步步分析下这个画板是怎么实现的吧!小程序

1、界面的生成windows

大致分析一下一个画图板界面能够分红那些部分:总体的一个大窗体,处于最顶部的一个菜单栏,左侧的工具栏,中间空白的画图纸,下部的颜色选择器以及底部有一条帮助提示栏。最先我所作的画图板把这些生成界面的相关代码都给写在了同一个类里面,其中包括各类组件的添加和布局,那样写的话就会显得十分的乱,想要修改某一部分就要在里面找上很久。后来这个最新弄得画板在生成这个界面的时候采用的方法是每一部分的组件单独成一类,在每个类中写一个初始化的方法,而且重载他的构造方法,这样只要在主类中调用他的构造方法再合理的安排一下布局就能够了。这样作每一部分组件单独成类显得十分清晰,但也有必定的不足,就是在这些类与后来定义的监听器类之间相互传递参数的时候就会很麻烦,常常传参数传的本身头昏脑胀的。。但确定没有万全的方法吧,看本身习惯怎么弄了~~数组

各个组件部分是怎么生成的在这里我就不一一列出来了,这儿就把左侧工具栏部分的生成用代码表示一下,其它部分都类似的。dom

package db.xyz.DrawBoardTool;

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.FlowLayout;

import javax.swing.ImageIcon;

import javax.swing.JButton;

import javax.swing.JPanel;

import db.xyz.Listener.DrawListener;

import db.xyz.Listener.HelpListener;

/**

* 建立工具栏

* @author xiao

*

*/

public class DrawBoardTool extends JPanel{

DrawListener dListener;

/*

* 重载他的构造方法

*/

public DrawBoardTool(DrawListener dListener){

this.dListener = dListener;

unitTools();

}

/*

* 生成工具栏的方法

*/

public void unitTools(){

//设置工具栏布局为流式布局

this.setLayout(new FlowLayout());

//建立一个窗体对象

JPanel panel = new JPanel();

//设置布局为网格布局

panel.setLayout(new FlowLayout());

panel.setPreferredSize(new Dimension(70,300));

//数组存放图片位置

String [] tool = {"image/line.png","image/pencil.png","image/rect.png","image/frect.png","image/oval.png","image/foval.png","image/zhex.png","image/erase.png","image/penqi.png","image/brush.png","image/roundrect.png","image/xiqu.jpg"};

//数组存放控制命令

String [] command = {"line","pencil","rect","frect","oval","foval","zhex","erase","penqi","brush","roundrect","xiqu"};

HelpListener dl = new HelpListener();

for(int i = 0;i

ImageIcon imgIcon = new ImageIcon(tool[i]);

//建立JButton按钮对象添加图标设置大小

JButton button = new JButton(imgIcon);

button.setPreferredSize(new Dimension(30,30));

//将按钮添加到panel上

panel.add(button);

button.setActionCommand(command[i]);

button.addActionListener(dListener);

button.addMouseListener(dl);

}

JPanel panel_sel = new JPanel();

panel_sel.setBackground(Color.LIGHT_GRAY);

panel_sel.setPreferredSize(new Dimension(60,80));

panel.add(panel_sel);

this.add(panel);

}

}

能够看一下这里添加各个组件的按钮时候采用的是一个循环,这样添加图标能够节省不少语句,而且在每一个循环添加按钮的同时也对这些按钮添加了按钮图片图标,设置了动做命令。生成这样一个产生工具栏的类后,在主类中只要实例化一个DrawBoardTool类的对象,再设置他的布局为放置在西边的边框布局就完成了工具栏的添加。编程语言

其余那些组建模块的生成与添加的代码就再也不这里列出了,由于都是很类似的,最后会付所有代码的。工具

2、监听器的添加——使画板有生命布局

这样在添加了各个组件以后的画板只能够说是形似XP的画图板,但他倒是一个死的。~没法执行任何动做,除非右上角的关闭按钮。接下来就是要让这个画板富有生命,咱们点击直线,就能够在白纸上画直线……学习

以前关于监听器只接触过动做监听器就是ActioinListener。但这里在画图的时候须要的就是与鼠标有关监听器:MouseListener和MouseMotionListener。这两个监听器都有着本身的方法,其中MouseListener有五个方法,分别对应的操做是鼠标按下、松开、进入、移出和点击。MouseMotionListener只有一个鼠标拖动的方法。这些方法足以完成咱们的画图板。

关于监听器具体怎么用就不用我说明了吧。看这些文章的都是大牛们。~我也只总结一下在设置这些监听器时容易出错的地方吧。

先来了解下画图的机制吧,就好比画直线,咱们鼠标按下进行拖动,而后松开的时候屏幕上就会出现一条直线。怎么画直线的方法不须要咱们本身去写,Graphics类中已经定义好了方法:drawLine(x1,y1,x2,y2);能够看出这个方法是须要传入4个参数的,分别是两个点的4个坐标,这样调用这个方法后就会在这两个点之间生成一条直线。因此分析一下咱们只须要获得的就是鼠标按下开始拖动时的那个起始点的坐标以及最后松开画直线时的那个终点的坐标,就能够完成这个直线。

咱们就要重写MouseListener这个接口中的方法:mousePressed和mouseReleased。

public void mousePressed(MouseEvent e) {

String command = e.getActionCommand();

x1 = e.getX();

y1 = e.getY();

}

public void mouseReleased(MouseEvent e) {

int x2 = e.getX();

int y2 = e.getY();

if(command.equals("line")){

//画一条直线

db.g.drawLine(x1,y1,x2,y2);

}

这样就能够画直线了!其中有一句代码String command = e.getActionCommand();他的做用是获取动做命令。咱们在添加按钮的时候给每个按钮都赋予了不一样的动做命令,这样是为了判断咱们选择的到底是那一个按钮要执行那一种操做。在监听器里面调用 e.getActionCommand();就能够得到所按按钮的动做命令,这里获取动做命令以后判断若是是"line"那么就是要画直线,因此在鼠标松开的时候调用了drawLine那个方法来画直线。

这里还要说一下那个g是什么东西~~g说白了就是画布,就是那片白纸。咱们在生成画布以后要调用一个方法:Graphics g = dpaper.getGraphics(); 这个语句的做用就是获取画布,就是为了知道咱们要在哪里进行做图的。

如今这个画图板已经能够画一条直线了,与画直线相似的还有(内填充)矩形,(内填充)椭圆,圆角矩形这些,说类似但也不彻底相同,有一点仍是须要注意的。以画矩形为例,咱们查看API中drawRect这个方法发现他也有四个参数:int x, int y, int width, int height。很显然这四个参数是一个点的一对儿坐标和长还有宽。这里若是仍是像以前画直线那样把x1赋给x,y1赋给y。x2-x1赋给width,y2-y1赋给height。若是这样的话,运气好的话咱们是能够话出来一个矩形的,但只能正确的画出一种矩形,就是鼠标拖动的方向是从左上向右下的。其余的矩形会偏离咱们鼠标所滑动的区域。那这是为何呢?其实只要咱们好好看一下drawRect这个方法,好好看下他的四个参数表明的东西就会发现问题:坐标xy是矩形的左上点的坐标。因此咱们鼠标按下松开获取的x1x2y1y2这四个坐标,咱们就要从中找出左上角的那个坐标。不难分析,窗体左上角的坐标为(0,0)。因此左上角的坐标是较小的,因此只需调用一个取较小值的一个方法Math.min(x1,x2),Math.min(y1, y2)这样分别赋给x,y就能够了。另外,长宽的设置,咱们也不能直接就x2-x1,y2-y1,须要对其取一个绝对值,这一点很好理解吧。那就是Math.abs(x1-x2),Math.abs(y1-y2)。这样就能够正确的画出一个矩形了。

如今那些直线、矩形、椭圆这些均可以实现了。下面再总结下铅笔那一类工具的实现。

若是咱们打开windows自带的画板,使用铅笔工具画一段曲线,再用放大镜来观看,就会发现:铅笔所画出的曲线其实就是一段段很短的直线链接所造成!这就给咱们写铅笔的方法带来了灵感。但这里还须要用到另外一个监听器:MouseMotionListener。它里面只有一个方法:MouseDragged。很显然这个方法是在鼠标拖动的时候调用。因此咱们在鼠标按下的时候获取到x1,y1这初始坐标,以后每拖动一次就获取一对(x3,y3)坐标,并在这两个点之间画一段小直线,以后再把这个(x3,y3)赋给(x1,y1)做为下一段直线的初始坐标,当拖动后再来画出下一小段直线,如此往复就能够完成铅笔的功能啦!

public void mouseDragged(MouseEvent e) {

//画铅笔

if(command.equals("pencil")){

x3 = e.getX();

y3 = e.getY();

db.g.drawLine(x1,y1,x3,y3);

x1 = x3;

y1 = y3;

}

铅笔弄好啦那什么橡皮和刷子天然而成。喷漆的作法也如此,只不过喷漆还要多一个随机数,就是在周围多少坐标的范围内随机生成必定的小点点来实现喷漆的功能:

//画喷漆

else if(command.equals("penqi")){

x3 = e.getX();

y3 = e.getY();

Random rand = new Random();

//使用循环,来画15个小点

for(int i=0;i<15;i++){

//在20个像素点的范围内随机一个值

int tempx = rand.nextInt(20);

int tempy = rand.nextInt(20);

//开始画点了

db.g.drawLine(x3+tempx, y3+tempy, x3+tempx, y3+tempy);

}

}

这样画图板的这些基本功能就都完成了。还有一个就是吸管取色的功能,这个再下一篇关于画图板的重绘操做时再来介绍吧!

3、让画图板靓丽起来

如今虽然各个组件的功能都已实现,但却都是黑色的,画的只有黑色的直线,黑色的矩形、椭圆……那么就要使咱们能够给做图设置颜色。这个就很简单了。咱们以前在界面中已经把颜色条儿给生成了,那么咱们只要使一个监听器坚挺那些按钮,再经过动做命令来判断所选择的颜色,在调用setColor这个方法就能够完成了!

到如今,这个画板的基本功能就完成啦~~快来画出本身喜欢的图案吧!!

java画图板代码_java学习小总结——画图板制做(附代码)相关推荐

  1. 【微信小程序canvas】实现小程序手写板用户签名(附代码)

    [微信小程序canvas]实现小程序手写板用户签名(附代码) 工作中公司业务需要的微信小程序用户签字功能 先看效果图: wxml <view class="wrapper"& ...

  2. 【微信小程序canvas】实现小程序手写板用户签名(附代码)测试有效

    工作中公司业务需要的微信小程序用户签字功能 先看效果图: wxml: <view class="wrapper"><view class="handBt ...

  3. 【AI超级美发师】深度学习算法打造染发特效(附代码)

    [新智元导读]如今,在类似天天P图.美图秀秀等手机APP中,给指定照片或视频中的人物更换头发颜色已经是再正常不过的事情了.那么本文便介绍了该功能背后如AI头发分割模块.头发换色.颜色增强与修正模块等技 ...

  4. SLAM学习 | 单目相机标定(附代码实测可用)

    SLAM学习 | 单目相机标定(附代码实测可用) 1 针孔相机模型 2 张正友标定法 3 VS2013下配置openCV 4 标定过程与结果 5 经验总结与注意事项 概要: 这篇文章介绍如何解决做SL ...

  5. python画小汽车代码_Python实战小程序利用matplotlib模块画图代码分享

    Python中的数据可视化 matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件. 实战小程序: ...

  6. java 实例变量初始化_java学习之实例变量初始化

    实例变量的初始化方法 第一种:通过构造函数进行初始化. 第二种:通过声明实例字段初始化. 第三种:通过对象代码块初始化. 通过构造函数进行初始化方法 通过构造函数进行对象初始化,必须在类中声明一个带参 ...

  7. python画图代码-Python实战小程序利用matplotlib模块画图代码分享

    Python中的数据可视化 matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件. 实战小程序: ...

  8. 用python画图代码-Python实战小程序利用matplotlib模块画图代码分享

    Python中的数据可视化 matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件. 实战小程序: ...

  9. 如何用不到200行代码实现经典小游戏贪吃蛇,附源代码及详细实现思路

    不多废话,直接上链接 链接:https://pan.baidu.com/s/1ZKtVNhzR4fIzNZSGWgFKQw?pwd=zglt  提取码:zglt 有需要的好兄弟们可以直接取用,想要了解 ...

最新文章

  1. aws s3 静态网站_如何将静态网站或JAMstack应用托管并部署到AWS S3和CloudFront
  2. 网络共享及排错+卷影副本
  3. tf.squared_difference
  4. mysql 散列查询_MySQL InnoDB中hash查找表的实现
  5. 团队作业第一次-团队团队展示
  6. java equals() 函数_java equals()函数与‘==’
  7. 【深度学习】2021年深度学习哪些方向比较新颖,处于上升期或者朝阳阶段,没那么饱和,比较有研究潜力?...
  8. c++小项目_编程初学者的练手小项目(Pythonamp;C/C++)
  9. lt;++mysql_php+js+mysql设计的仿webQQ-lt;1gt;邮箱验证
  10. backlog配置_Tomcat 配置详解和调优
  11. 记一次 React 组件无法更新状态值的问题分析与解决
  12. C++类的静态数据成员-关键字static
  13. Objective-C学习之旅(四)----内存管理2----retain点语法
  14. 商品类别推荐系统:LightGBM模型
  15. Springboot毕设项目眼镜店管理系统1m12ajava+VUE+Mybatis+Maven+Mysql+sprnig)
  16. js 获取当天23点59分59秒 时间戳
  17. ubantu18-ROS环境下配置IMU(STIM300),含驱动下载安装与硬件配置。
  18. Windows 下载WebStorm
  19. 京东JDK在大数据平台的探索与研究
  20. 浅谈虚拟化软件再防泄密领域的表现如何

热门文章

  1. OpenCASCADE:Modeling Algorithms模块标准拓扑对象
  2. boost::mp11::mp_partial_sum相关用法的测试程序
  3. boost::mp11::mp_find_if相关用法的测试程序
  4. 使用 Boost.Math 计算 Jacobi Zeta 函数的简单示例, 并使用相应的 WolframAlpha 命令
  5. boost::detail::allocator模块的测试程序
  6. boost::detail::sp_typeinfo用法实例
  7. 基于Boost::beast模块的无栈协程WebSocket服务器
  8. VTK:可视化算法之FilledContours
  9. VTK:Medical之TissueLens
  10. VTK:几何对象之TessellatedBoxSource