思路:
①画图板的界面
②创建监听器类
③给按钮加上鼠标监听
③画图版的重绘

第一部分:界面类
①画图板的界面 ③给按钮加上鼠标监听

public class SampleDraw extends JFrame {public static void main(String[] args) {SampleDraw sam = new SampleDraw();//创建该类对象sam.showUI();//调用showUI方法}public void showUI() {this.setSize(800, 600);//设置尺寸this.setTitle("画板v1.0");//设置标题this.setLocationRelativeTo(null);//设置居中this.setDefaultCloseOperation(3);//设置关闭进程FlowLayout flow = new FlowLayout();//布局方式为流式布局this.setLayout(flow);Color[] color = { Color.GREEN, Color.RED, Color.BLUE, Color.YELLOW };//创建一个数组保存颜色DrawListener drawListener = new DrawListener();//新建监听器对象for (int i = 0; i < color.length; i++) {//利用循环将颜色依次将赋给按钮的背景色JButton jbu = new JButton();jbu.setPreferredSize(new Dimension(30, 30));//设置按钮尺寸jbu.setBackground(color[i]);//设置按钮的背景色this.add(jbu);//把按钮加给窗体jbu.addActionListener(drawListener);//给按钮添加监听器}String[] name = { "直线", "三角形", "正方形","矩形", "椭圆","棱形", "五边形", "图片1", "图片2", "画笔", "特殊三角形", "多边形" };创建一个数组保存按钮名称for (int i = 0; i < name.length; i++) {//利用循环将名字赋给按钮JButton jbu1 = new JButton(name[i]);//创建按钮对象this.add(jbu1);//把按钮对象加给窗体jbu1.addActionListener(drawListener);//给按钮添加监听器}this.setVisible(true);  //设置窗体可见Graphics g = this.getGraphics();//创建画笔this.addMouseListener(drawListener);//添加鼠标监听器this.addMouseMotionListener(drawListener);//添加鼠标拖动监听器drawListener.setGr(g);//调用监听器的set方法drawListener.setShape(listshape);//调用监听器的setShape方法}
}

第二部分:监听器类
②创建监听器
该类应该继承MouseListener, ActionListener, MouseMotionListener的接口

public class DrawListener implements MouseListener, ActionListener, MouseMotionListener {private Graphics gr;//声明对象private Color color;private int flag = 1;private String name;private int x1, y1, x2, y2, x3, y3,x4,y4;private ImageIcon icon = new ImageIcon("C:\\Users\\Administrator\\Pictures\\lu.jpg");//添加图片。注意路径为绝对路径,单斜杠变成双斜杠,加文件名和后缀格式private ImageIcon icon2 = new ImageIcon("C:\\Users\\Administrator\\Pictures\\hua.jpg");private ArrayList<Shape> listshape;public void setGr(Graphics g) {//传画笔gr = g;}public void setShape(ArrayList<Shape> listshape) {//传数组this.listshape = listshape;}public void actionPerformed(ActionEvent e) {//监听方法if ("".equals(e.getActionCommand())) {//如果按钮的文本内容为""JButton jbu = (JButton) e.getSource();color = jbu.getBackground();//获取按钮的背景色gr.setColor(color);} else {//按钮文本内容不为空name = e.getActionCommand();//将按钮的文本内容赋给name}}public void mouseDragged(MouseEvent e) {x3 = e.getX();//x3  y3 为鼠标按压拖动时的坐标y3 = e.getY();if ("画笔".equals(name)) {//如果点击是“画笔”按钮gr.drawLine(x1, y1, x3, y3);//画线x1 = x3;y1 = y3;
//          更新x1,y1的值,把每一个点依次相连。}}public void mouseMoved(MouseEvent e) {}public void mouseClicked(MouseEvent e) {x4 = e.getX();//将鼠标点击时的坐标赋给x4,y4y4 = e.getY();if ("特殊三角形".equals(name) && flag == 2) {//此时flag为2时,才能将点击的点和直线的两端链接起来gr.drawLine(x1, y1, x4, y4);//画线gr.drawLine(x2, y2, x4, y4);flag = 1;//画完线后,将flag的值赋为1,这样能接着画第二个三角形}if ("多边形".equals(name) && flag == 2) {gr.drawLine(x2, y2, x4, y4);x2 = x4;y2 = y4;if (e.getClickCount() == 2) {//如果为双击gr.drawLine(x1, y1, x4, y4);flag = 1;}}}public void mousePressed(MouseEvent e) {if (flag == 1) {x1 = e.getX();y1 = e.getY();}}public void mouseReleased(MouseEvent e) {if (flag == 1) {x2 = e.getX();y2 = e.getY();}if ("直线".equals(name)) {gr.drawLine(x1, y1, x2, y2);}if ("矩形".equals(name)) {gr.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2));}if ("椭圆".equals(name)) {gr.drawOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2));}if ("三角形".equals(name)) {int[] xPoints = new int[] { x1, Math.abs((x1 + x2) / 2), x2 };int[] yPoints = new int[] { y2, y1, y2 };int nPoints = 3;gr.drawPolygon(xPoints, yPoints, nPoints);}if ("图片1".equals(name)) {gr.drawImage(icon.getImage(), Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2),null);}if ("图片2".equals(name)) {gr.drawImage(icon2.getImage(), Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2),null);}if ("正方形".equals(name)) {gr.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(x1 - x2));}if ("棱形".equals(name)) {int[] xPoints = new int[] { (x1 + x2) / 2, x2, (x1 + x2) / 2, x1 };int[] yPoints = new int[] { y2, (y1 + y2) / 2, y1, (y1 + y2) / 2 };int nPoints = 4;gr.drawPolygon(xPoints, yPoints, nPoints);}if ("五边形".equals(name)) {int[] xPoints = new int[] { (x1 + x2) / 2, x2, x2 - (x2 - x1) / 4, x1 + (x2 - x1) / 4, x1 };int[] yPoints = new int[] { y1, (y1 + y2) / 2, y2, y2, (y1 + y2) / 2 };int nPoints = 5;gr.drawPolygon(xPoints, yPoints, nPoints);}if ("特殊三角形".equals(name) && flag == 1) {gr.drawLine(x1, y1, x2, y2);flag++;}if ("多边形".equals(name) && flag == 1) {gr.drawLine(x1, y1, x2, y2);flag++;}}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}
}

现在就实现了简单的画图版了,但是会有一个问题,当我们改变窗体的大小或者最小化窗体再打开来会发现,之前画的图都不见了。这是因为当窗体发生改变时,程序会重新从内存中获取更新后的数据绘制。我们没有将画过的形状存放到内存中,当窗体发生重绘的时候,就不会绘制了

第三步:画图板的重绘
定义一个Shape类。
其中定义一个队列,用于存放图形对象。(队列的大小随对象的增加而增加)

public class Shape {private String name;private Color color; private int x1, x2, y1, y2 ;private ImageIcon icon = new ImageIcon("C:\\Users\\Administrator\\Pictures\\lu.jpg");private ImageIcon icon2 = new ImageIcon("C:\\Users\\Administrator\\Pictures\\hua.jpg");public void setShape(int x1, int y1, int x2, int y2, String name, Color color) {this.x1 = x1;this.x2 = x2;this.y1 = y1;this.y2 = y2;this.name = name;this.color = color;}public void drawShape(Graphics g) {switch (name) {case "直线":g.setColor(color);g.drawLine(x1, y1, x2, y2);break;case "矩形":g.setColor(color);g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2));break;case "椭圆":g.setColor(color);g.drawOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2));break;case "三角形":g.setColor(color);int[] xPoints = new int[] { x1, Math.abs((x1 + x2) / 2), x2 };int[] yPoints = new int[] { y2, y1, y2 };int nPoints = 3;g.drawPolygon(xPoints, yPoints, nPoints);break;case "画笔":g.setColor(color);g.drawLine(x1, y1, x2, y2);break;case "正方形":g.setColor(color);g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(x1 - x2));break;case "五边形":g.setColor(color);int[] xPoints1 = new int[] { (x1 + x2) / 2, x2, x2 - (x2 - x1) / 4, x1 + (x2 - x1) / 4, x1 };int[] yPoints1 = new int[] { y1, (y1 + y2) / 2, y2, y2, (y1 + y2) / 2 };int nPoints1 = 5;g.drawPolygon(xPoints1, yPoints1, nPoints1);break;case "棱形":g.setColor(color);int[] xPoints2 = new int[] { (x1 + x2) / 2, x2, (x1 + x2) / 2, x1 };int[] yPoints2 = new int[] { y2, (y1 + y2) / 2, y1, (y1 + y2) / 2 };int nPoints2 = 4;g.drawPolygon(xPoints2, yPoints2, nPoints2);break;case "特殊三角形":g.setColor(color);g.drawLine(x1, y1, x2, y2);break;case "多边形":g.setColor(color);g.drawLine(x1, y1, x2, y2);break;case"图片1":g.setColor(color);g.drawImage(icon.getImage(), x1,y1,x2,y2,null);break;case"图片2":g.setColor(color);g.drawImage(icon2.getImage(), x1,y1,x2,y2,null);break;}}
}

再在监听器类中,画一个图形就将图形存入Shape类中的队列中去。例如:

if ("直线".equals(name)) {gr.drawLine(x1, y1, x2, y2);Shape shape = new Shape();shape.setShape(x1, y1, x2, y2, name, color);listshape.add(shape) ;}

最后在主界面的类中去定义重绘的方法和调用。在重绘方法中将队列中的对象取出来,调用画的方法

public void paint(Graphics g) {//重绘方法super.paint(g);//进行重绘for (int i = 0; i < listshape.size(); i++) {Shape shape = listshape.get(i);//依次取出对象if (shape != null) {shape.drawShape(g);//调用对象的画的方法} else {break;}}}

图形的重绘就到这里啦!

Java画图板的简单实现。(重绘,多边形,曲线画笔,画图片)相关推荐

  1. java画图板之平面山水画(一)

    前期准备 在上次的博客中,我们已经用java了解并制作了画图板,可以在上面添加绘制椭圆.曲线.填充.改变颜色等功能,在之后的版本中会进行修改.     今天要做的是通过递归的方式绘制山脉. 具体步骤 ...

  2. java画图板之平面山水画(二)

    java画图板之平面山水画(一):https://blog.csdn.net/qq_43348021/article/details/104346805 上次的博客中已经将山脉的轮廓画出来了,这次我们 ...

  3. JAVA画图板01 —— 窗体的实现

    画图板 界面开发: 创建窗体对象 完善界面 个人将自制的JAVA画图板分为了三个模块,分别是界面.监听器以及画笔,这一章来介绍界面的相关代码. 界面开发: 创建窗体对象 首先需要创建一个窗体对象.JF ...

  4. java画图板代码_java学习小总结——画图板制做(附代码)

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

  5. 一个Java画图板程序的设计

    本文讲述一个画图板应用程序的设计,屏幕抓图如下.这篇文章带有三个附件,其中两个jar文件都是j2sdk1.4.2_08编译打包,包含源代码,可执行,如下表: 附件名称及链接 详情 jDraw_basi ...

  6. java入门之 画板及画板重绘(详细版)

    关于画板和画板重绘 效果图如下(完整代码请看文末): 为什么要重绘 在Java中,Swing组件是由开发人员编写好的,所有我们看得见的组件(包括窗体)都是画出来的,当我们改动窗体的大小时,即重新调动了 ...

  7. Java 画图板用随机数搞“混沌游戏”

    今晚做了这样的一个任务:用随机数在画图板里面生成四个点,然后选出其中的三个点组成一个三角形,把三角形的三个顶点标为1.2.3,另一个点标为4,把4点随机与1.2.3三个点中一个点进行连接,取连线的中点 ...

  8. Java画图板界面上的添加

    步骤 1.创建类来实现接口(动作监听器和鼠标监听器) 2.在按钮上添加动作监听器,通过e.getActioncommand(),来得到按钮上的字,通过button =(JButton)e.getAct ...

  9. 曲线数据提取-图片转数据或曲线重绘,曲线更换颜色及曲线复现

    有时候,你手头上只有一张曲线图片,没有数据,也无法对图片进行编辑. 这时候,你可能需要对曲线数据进行提取,或者想重绘图片,使得它更加清楚,或者将曲线颜色更改.下面是一个例子,写在这里,以便查看. 原图 ...

最新文章

  1. 12)登录验证函数简单编写验证
  2. jQuery的位置信息和事件
  3. hadoop深入研究:(五)——Archives
  4. AliOS Things SIG BLE Mesh网络的介绍和搭建
  5. Idea创建一个springboot多模块项目
  6. padding、margin百分比
  7. hdu 2594(kmp)
  8. 详解 TypyScript 的一个怪异行为
  9. python客户端与服务器端通信_python客户端与服务器端的通信
  10. UGUI的Button和Toggle
  11. 安卓rom制作教程_【固件更新】极光ROM 小米MIX2、小米MAX2、小米Note3 MIUI11最新稳定版更新...
  12. swagger2 注解说明
  13. c#怎样将object转换过程int型
  14. JavaScript 中的继承:ES3、ES5 和 ES6
  15. HDMI转VGA转换器 HDMI转接头,VGA转换器
  16. 杭州公司java开发工程师常见面试问题
  17. FFplay文档解读-43-视频过滤器十八
  18. DDR、DDR2、DDR3、DDR4、LPDDR区别
  19. 《数学建模简明教程--基于python》学习笔记-第四章-微分方程-课后习题解答
  20. 2019 DENSE-HAZE: A BENCHMARK FOR IMAGE DEHAZING WITH DENSE-HAZE AND HAZE-FREE IMAGES

热门文章

  1. office 2010系列产品重输密钥的方法
  2. NOBOOK教育应用受邀参展南昌教育装备展
  3. vim 文件编辑器配色(colorscheme)主题方案
  4. Educational Codeforces Round 118 (Rated for Div. 2) A-C
  5. 交易服務助力大數據產業生態系統完善
  6. Win7禁用UAC(User Account Control,用户帐户控制)设置
  7. 听说这份试卷只有程序员能打满分...
  8. 【亲测有效】一键解决PotPlayer 启动超级缓慢,无法正常播放视频
  9. 五个维度比较四种芯片在AI上的表现
  10. 【高数】微分中值定理有关的一道证明题