本作者在构造射线的重绘时出现了错误,将会在以后的文章中贴出来。。。

画板的重绘

      当窗体的状态发生改变时,画板上的缓存会自动清空。屏幕上绘制的图像是将窗体中的对象数据从内存中取出来放到缓存中,再绘制的。故因此需要找一个东西来存这些图形的数据。
步骤
一,创建一个图形类,构造绘制图形的属性和绘图的方法。
package com.xx.h;import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;public class Shap {String type;int x1, y1, x2, y2, x3, x4, x5, y3, y4, y5, x6, y6, x7, y7;int x0, y0, dx, dy, x1f, y1f, x2f, y2f, x1d, x2d, y1d, y2d, x3d, y3d, n;Color color;public void drawShape(Graphics gp) {gp.setColor(color);if (type.equals("╲")) {gp.drawLine(x1, y1, x2, y2);} else if (type.equals("□")) {gp.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2 - x1), Math.abs(y2 - y1));System.out.println("鼠标释放");} else if (type.equals("○")) {gp.drawOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2 - x1), Math.abs(y2 - y1));} else if (type.equals("△")) {gp.drawLine(x3, y3, x4, y4);gp.drawLine(x5, y5, x4, y4);gp.drawLine(x3, y3, x5, y5);} else if (type.equals("谢尔彬三角形")) {drawsjx(8, 500, 500, 400, 400, gp);}else if(type.equals("地毯")){drawdt(6, 300, 300, 550, gp);}else if (type.equals("蕨类")) {drawjue(gp);} else if (type.equals("画笔")) {gp.drawLine(x1, y1, x6, y6);} else if (type.equals("射线")) {gp.drawLine(x1, y1, x6, y6);}else if(type.equals("枫叶")){drawfy(gp);}}private void drawfy(Graphics g) {double xn1 = 0f, yn1 = 0f;// double a[]=;直接定义// int i[]=new int[10]; 先定义大小再根据for循环(要创建一个方法)double a[] = { 0.1400, 0.4300, 0.4500, 0.4900 };double b[] = { 0.0100, 0.5200, -0.4900, 0.0000 };double c[] = { 0.0000, -0.4500, 0.4700, 0.0000 };double d[] = { 0.5100, 0.5000, 0.4700, 0.5100 };double e[] = { -0.0800, 1.4900, -1.6200, 0.0200 };double f[] = { -1.3100, -0.7500, -0.7400, 1.6200 };Random rr = new Random(4);for (int i = 1; i < 22500; i++) {int tt = rr.nextInt(4);double xn11 = (a[tt] * xn1 + b[tt] * yn1 + e[tt]);double yn11 = (c[tt] * xn1 + d[tt] * yn1 + f[tt]);System.out.println(xn11 + "    " + yn11);int x1 = (int) (xn11 * 130 + 700);int y1 = (int) (yn11 * 130 + 600);g.setColor(new Color(198, 60, 60));g.drawLine(x1, y1, x1, y1);System.out.println(x1 + "    " + y1);xn1 = xn11;yn1 = yn11;}}public void drawdt(int n, int x0f, int y0f, int dx,Graphics g) {if (n == 0)return;
//      try {//          Thread.sleep(10);
//      } catch (InterruptedException e) {//          // TODO Auto-generated catch block
//          e.printStackTrace();
//      }Random ra = new Random();ra.nextInt(255);g.setColor(new Color(ra.nextInt(255), ra.nextInt(255), ra.nextInt(255)));g.drawRect(x0f, y0f, dx, dx);int x0d = x0f + (dx / 3);int y0d = y0f + (dx / 3);g.drawRect(x0d, y0d, dx / 3, dx / 3);drawdt(n - 1, x0f, y0f, dx / 3,g);drawdt(n - 1, x0d, y0f, dx / 3,g);drawdt(n - 1, x0d + dx / 3, y0f, dx / 3,g);drawdt(n - 1, x0f, y0f + dx / 3, dx / 3,g);drawdt(n - 1, x0d + dx / 3, y0f + (dx) / 3, dx / 3,g);drawdt(n - 1, x0f, y0d + (dx) / 3, dx / 3,g);drawdt(n - 1, x0d, y0d + (dx) / 3, dx / 3,g);drawdt(n - 1, x0d + dx / 3, y0d + (dx) / 3, dx / 3,g);}public void drawsjx(int n, int x0, int y0, int dx, int dy, Graphics g) {System.out.println("三角形");if (n == 0)return;// ra.nextInt(255);System.out.println("DRAWXRB1");int x1f = x0 + dx;int x2f = x0 - dx;int y1f = y0 + dy;int y2f = y0 + dy;g.drawLine(x0, y0, x1f, y1f);g.drawLine(x0, y0, x2f, y2f);g.drawLine(x2f, y2f, x1f, y1f);int x1d = (x0 + x1f) / 2;int y1d = (y0 + y1f) / 2;int x2d = (x0 + x2f) / 2;int y2d = (y0 + y2f) / 2;int x3d = (x1f + x2f) / 2;int y3d = y2f;g.drawLine(x1d, y1d, x2d, y2d);g.drawLine(x1d, y2d, x3d, y3d);g.drawLine(x2d, y2d, x3d, y3d);drawsjx(n - 1, x1d, y1d, dx / 2, dy / 2, g);drawsjx(n - 1, x2d, y2d, dx / 2, dy / 2, g);drawsjx(n - 1, x0, y0, dx / 2, dy / 2, g);}public void drawjue(Graphics g) {double xn1 = 0, yn1 = 0;double a[] = { 0.0, 0.2, -0.15, 0.85 };double b[] = { 0.0, -0.26, 0.28, 0.04 };double c[] = { 0.0, 0.23, 0.26, -0.04 };double d[] = { 0.16, 0.22, 0.24, 0.85 };double e[] = { 0.0, 0.0, 0.0, 0.0 };double f[] = { 0.0, 1.6, 0.44, 1.6 };// 定义一个随机类Random rr = new Random();// 递归调用225000次for (int i = 1; i < 22500; i++) {// 可以轮流得到七个数int tt = rr.nextInt(100);int m = 0;if (tt < 2) {m = 1;} else if (tt > 1 && tt < 9) {m = 2;} else if (tt > 8 && tt < 15) {m = 3;} else if (tt > 14 && tt < 101) {m = 3;}double xn11 = a[m] * xn1 + b[m] * yn1 + e[m];double yn11 = c[m] * xn1 + d[m] * yn1 + f[m];System.out.println(xn11 + "    " + yn11);int x1 = (int) (xn11 * 50 + 300);int y1 = (int) (yn11 * 50 + 400);g.drawLine(x1, y1, x1, y1);System.out.println(x1 + "    " + y1);// 递归调用xn1 = xn11;yn1 = yn11;}}
}
二,构造主面板的类

在构造主面板的类上构造一个图形类的数组,并定义好大小。
注意直接继承JFrame的类

public class Rejframe extends JFrame {Shap s[] = new Shap[100000];

重写Jframe 的paint方法(在paint方法中引入数组对象)

 public void paint(Graphics g) {super.paint(g);for (int i = 0; i < s.length; i++) {if (s[i] != null) {s[i].drawShape(g);}}}
}

或者构造一个新的类来重写paint的方法

public class Njframe extends JFrame{Shape[] shapestr;public Njframe(Shape[] shapestr2) {this.shapestr=shapestr2;}public void paint(Graphics g){super.paint(g);for (int i = 0; i < shapestr.length; i++) {Shape s =shapestr[i];if(s!=null){s.drawShape(g);}}}
}

但是注意应该把构造画板的类上将
JFrame jf =new JFrame();
改成
Njframe jf = new Njframe();

二,在监听器里的实例化图形类的对象,并将对象传入到数组上
public class Dlistener implements MouseListener, ActionListener, MouseMotionListener {int x1, y1, x2, y2, x3, x4, x5, y3, y4, y5, x6, y6, x7, y7;int x8, y8;JFrame jf;String Bt = "";Color c;JButton btn;int count = 0;int count1 = 0;int intcount = 0;Graphics g;Shap[] h;JColorChooser jc = new JColorChooser();// 构造方法public Dlistener(Shap[] s) {this.h = s;}@Overridepublic void mouseDragged(MouseEvent e) {if (Bt.equals("画笔")) {x6 = e.getX();y6 = e.getY();Shap s = new Shap();s.type = Bt;s.x1 = x1;s.y1 = y1;s.x6 = x6;s.y6 = y6;s.drawShape(g);h[count] = s;count++;x1 = x6;y1 = y6;}if (Bt.equals("射线")) {x6 = e.getX();y6 = e.getY();if (count1 == 0) {g.drawLine(x1, y1, x6, y6);x7 = x6;y7 = y6;// 此时若不传值,则为一根白一根黑count1++;} else if (count1 == 1) {g.setColor(Color.white);g.drawLine(x1, y1, x7, y7);g.setColor(Color.black);count1 = 0;}}if (Bt.equals("射线")) {x6 = e.getX();y6 = e.getY();Shap s = new Shap();s.x1 = x1;s.y1 = y1;s.x6 = x6;s.y6 = y6;s.type = Bt;s.color = c;s.drawShape(g);h[count] = s;count++;}}@Overridepublic void mouseMoved(MouseEvent e) {}@Overridepublic void actionPerformed(ActionEvent e) {Bt = e.getActionCommand();System.out.println(Bt);if (Bt.equals("")) { // 得到按钮对象(可以得到颜色等属性);通过e的点击可以得到按钮的属性。btn = (JButton) e.getSource();// 如果通过传值的话。。。。是得不到的// 得到按钮的颜色c = btn.getBackground();// 将颜色设置给画笔(画布)g.setColor(c);}if (Bt.equals("Color")) {btn = (JButton) e.getSource();c = JColorChooser.showDialog(jc, null, Color.WHITE);g.setColor(c);btn.setBackground(c);}Shap s = new Shap();s.type = Bt;s.color = c;s.drawShape(g);h[count] = s;count++;//// else if (Bt.equals("地毯")) {// // drawdt(6, 300, 300, 550);// }//// if (Bt.equals("gaga1")) {// // drawjaja1();// }// if (Bt.equals("自定义")) {// // drawjaja2(22, 22);// }// if (Bt.equals("枫叶")) {// // drawjaja3(0, 0);// }// if (Bt.equals("梅花")) {// // drawjava4();// }// if (Bt.equals("ga")) {// // drawjava5();// }// if (Bt.equals("3D")) {// // drawjava6();// }// if (Bt.equals("蕨类")) {// Shap s = new Shap();// s.type = Bt;// s.color = c;// s.drawShape(g);// h[count] = s;// count++;//// }}public void mouseClicked(MouseEvent e) {// if(e.getClickCount()==1){if (Bt.equals("△")) {Shap s = new Shap();if (intcount == 0) {x3 = e.getX();y3 = e.getY();intcount++;}else if (intcount == 1) {x4 = e.getX();y4 = e.getY();intcount++;}else if (intcount == 2) {x5 = e.getX();y5 = e.getY();s.type = Bt;s.x3 = x3;s.y3 = y3;s.x4 = x4;s.y4 = y4;s.x5 = x5;s.y5 = y5;h[count] = s;s.drawShape(g);count++;intcount = 0;}}}@Overridepublic void mousePressed(MouseEvent e) {System.out.println("鼠标按下");x1 = e.getX();y1 = e.getY();}@Overridepublic void mouseReleased(MouseEvent e) {x2 = e.getX();y2 = e.getY();// 注意s实例化的位置if (Bt.equals("╲")) {Shap s = new Shap();s.color = c;s.type = Bt;s.x1 = x1;s.x2 = x2;s.y1 = y1;s.y2 = y2;s.drawShape(g);h[count] = s;count++;}if (Bt.equals("□")) {Shap s = new Shap();s.color = c;s.type = Bt;s.x1 = x1;s.x2 = x2;s.y1 = y1;s.y2 = y2;s.drawShape(g);h[count] = s;count++;}if (Bt.equals("○")) {Shap s = new Shap();s.color = c;s.type = Bt;s.x1 = x1;s.x2 = x2;s.y1 = y1;s.y2 = y2;s.drawShape(g);h[count] = s;count++;}}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}}

Java小白画图板的重绘包括谢尔宾斯基三角形和蕨类图像的重绘相关推荐

  1. 小白第一步|Java实现递归分形(以谢尔宾斯基三角形和勾股树为例)

    一个递归分形搞得我心态爆炸 于是 我一定要写个博客祭奠一下!!!!!! 首先回顾一下递归的几个要素: 1.return:往上回溯 2.调用自身:往下挖掘 3.设置条件:防止无限递归 4.递归操作:分析 ...

  2. 按钮动作监听器和鼠标监听器的同时实现,在画图板上画出三角形,射线,曲笔,谢尔宾斯基三角形,谢尔宾斯基地毯Random类的实现,数组的实现,Thread.sleep的实现

    按钮动作监听器和鼠标监听器的实现 实例化 实现 监听器的类 DrawListener dl = new DrawListener();// 在界面上添加鼠标监听器对象(鼠标监听器的对象可以是界面和按钮 ...

  3. Python数据结构15:turtle模块制图,画直线,正方形,星星,递归可视化:分形树,谢尔宾斯基三角形

    1. Python中的turtle模块制图 前面已经讲了递归的原理,这里用递归作图来直观的理解递归. 首先了解以下Python中用于作图的内置海龟作图系统turtle module. Python内置 ...

  4. Java面向对象编程:利用递归思想绘制“谢尔宾斯基地毯”和“谢尔宾斯基三角形”

    1.递归:在方法中调用本方法. 2.递归调用会无限循环下去,因此方法体中必须有结束方法的条件.返回值为void时通常写为: if (条件) {return; } 下面使用递归绘制"谢尔宾斯基 ...

  5. java中画三角形的方法_java画谢尔宾斯基三角形

    欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入 //6.定义重绘方法,拖动窗口,改变窗口大小后,绘制的图片仍然留在窗体上 public void paint(Graphic ...

  6. Java学习日记:UI篇(6)--谢尔宾斯基地毯图

    Java学习日记:UI篇(6)–谢尔宾斯基地毯图 引言:谢尔宾斯基地毯是数学家谢尔宾斯基提出的一个分形图形,谢尔宾斯基地毯和谢尔宾斯基三角形基本类似,不同之处在于谢尔宾斯基地毯采用的是正方形进行分形构 ...

  7. 画完三角形再画谢尔宾斯基地毯

    照样废话不说,看代码看注释 import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import jav ...

  8. c语言画谢宾斯基三角形

    谢宾斯基三角形是一个有意思的图形,(英语:Sierpinski triangle)是一种分形,由波兰数学家谢尔宾斯基在1915年提出,它是一种典型的自相似集. 先画一个三角形,然后呢,取三角形的中点, ...

  9. Java实现画图板画一只百度熊

    Java实现画图板画一只百度熊 笔记: 1.界面 2.鼠标监听器 鼠标按下: 获取坐标 鼠标松开: 获取坐标 画线 3.变量的作用域:在自己所属的代码块中. 局部变量和属性同名,则以局部变量优先显示. ...

最新文章

  1. asp.net 2.0防止同一用户同时登陆
  2. mysql 锁测试_mysql行级锁测试 - echowu007的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. linux内存屏障浅析
  4. Hadoop SSH免密登录公钥生成并实现不同主机间的免密登录
  5. Windows Azure移动终端云服务管理(公测版)
  6. CentOs基础操作指令(vim、关机)
  7. 马来西亚国家银行暂无发行央行数字货币计划
  8. 矩池云上Ubuntu18.6安装COMSOL Multiphysics 5.5
  9. 我购买了一台acer笔记本
  10. 计算机考研数据结构教材,2016计算机考研:数据结构参考书及复习重点
  11. 通过QQ 2012 客户端协议获取clientkey的0x30数据包分析
  12. iOS面试题大全(附带答案)
  13. python3 [爬虫入门实战] 爬虫之使用selenium 爬取百度招聘内容并存mongodb
  14. Excel数组与数组公式
  15. 计算机设备名称在哪里找,如何查看电脑驱动
  16. Java8 通关攻略
  17. pascal学习小记(六)---VMT
  18. 每天五分钟机器学习:如何计算模型的假阳性率和真阳性率?
  19. 计算机专业转正定级,大学生毕业一年以后千万别忘了转正定级(转自小志)
  20. 企业微信视频教程(Java标准版)-翟东平-专题视频课程

热门文章

  1. 少年宫计算机兴趣小组活动教案,少年宫书法兴趣小组教案
  2. 金属有机骨架复合物UiO-66-NH2/MoS2|PPS-ZIF-8-BSA|PVA/UiO-66|RhB@ZIF-8|RuCuMo@NH2-UIO-66|RGO-MIL-68(Fe)复合材料
  3. dhcp服务器的位置,5.4.3 扩展模式DHCP服务器地址池配置示例
  4. Matplotlib动图保存遇到MovieWriter有问题,自己写gif保存的代码
  5. ueditor php提交表单,ueditor在表单中的提交
  6. EXCEL功能之Excel标题跨列居中
  7. 即兴演讲的三定——主题、观点和框架
  8. 程序员的浪漫:晨起给女友定时发送天气预报,睡前给女友定时讲故事
  9. 如何使用Energia快速开发常见的MSP430/432LaunchPad
  10. Xamarin之TableView