1、搭建基本窗口框架


此部分是关于和用户交互之间的窗口,及一些参数的配置


public class DrawTest02 extends JFrame{public void DrawTest02(){JFrame jframe = new JFrame("画板");//创建JFrame对象 并对画板窗口进行命名JFrame jFrame = this;jframe.setSize(1000,800);//设定窗口大小jframe.setDefaultCloseOperation(EXIT_ON_CLOSE);//关闭窗口会结束当前运行状态jframe.setLocationRelativeTo(null);//设定画板页面中间jframe.setLayout(new FlowLayout());//创建流布局,自动根据窗口大小排列jframe.setVisible(true);//设定数据可视化开关jframe.addMouseListener(drawListenerA);//添加监听的对象}

创建工具类(颜色,坐标点等...)

class UtilityColor
{Color color;int x,x1,y,y1;String TypeName;public UtilityColor(Color color, int x, int x1, int y, int y1, String typeName) {this.color = color;this.x = x;this.x1 = x1;this.y = y;this.y1 = y1;TypeName = typeName;}public void drawShape(Graphics graphics){graphics.setColor(color);}
}

2、封装图形实现过程

此处是对于图像绘制的过程进行封装,方便重复调用

class Line extends  UtilityColor{//继承UtilityColor中的属性,并重写其中的实例方法//这是因为子类之间的实现功能需求不同public Line(Color color, int x, int x1, int y, int y1, String typeName) {super(color, x, x1, y, y1, typeName);}public void drawShape(Graphics graphics){super.drawShape(graphics);graphics.drawLine(x,y,x1,y1);}
}class  Rect extends UtilityColor{//继承UtilityColor中的属性,并重写其中的实例方法//这是因为子类之间的实现功能需求不同//由于此处我们有两个选项一个是实心矩形,一个不是//此处采用对于drawShpe方法重写中进行判断//注意:判断的内容要是什么,由于过程当中若是判断的是非实心矩形,//会造成实际画板上的内容,画一个非实心矩形,在使用实心矩形画不出来的情况//实心圆同理public Rect(Color color, int x, int x1, int y, int y1, String typeName) {super(color, x, x1, y, y1, typeName);}public void drawShape(Graphics graphics){super.drawShape(graphics);if(TypeName.equals("实心矩形")){graphics.fillRect(Math.min(x,y),Math.min(x1,y1),Math.abs(x - x1),Math.abs(y - y1));}else {graphics.drawRect(Math.min(x,y),Math.min(x1,y1),Math.abs(x - x1),Math.abs(y - y1));}}
}class Oval extends  UtilityColor{//继承UtilityColor中的属性,并重写其中的实例方法//这是因为子类之间的实现功能需求不同public Oval(Color color, int x, int x1, int y, int y1, String typeName) {super(color, x, x1, y, y1, typeName);}@Overridepublic void drawShape(Graphics graphics) {super.drawShape(graphics);if(TypeName.equals("实心圆")){graphics.fillOval(Math.min(x,y),Math.min(x1,y1),Math.abs(x - x1),Math.abs(y - y1));}else {graphics.drawOval(Math.min(x,y),Math.min(x1,y1),Math.abs(x - x1),Math.abs(y - y1));}}
}class  ABC extends UtilityColor{//等腰三角//继承UtilityColor中的属性,并重写其中的实例方法//这是因为子类之间的实现功能需求不同public ABC(Color color, int x, int x1, int y, int y1, String typeName) {super(color, x, x1, y, y1, typeName);}@Overridepublic void drawShape(Graphics graphics) {super.drawShape(graphics);int ix = (x + x1) /2;//顶点int ymin = Math.min(y,y1);int xmax = Math.max(x,x1);int xmin = Math.min(x,x1);int ymax = Math.max(y,y1);graphics.drawLine(ix,ymin,xmin,ymax);graphics.drawLine(xmin,ymax,xmax,ymax);graphics.drawLine(xmax,ymax,ix,ymin);}
}

3、窗口按键上色板块、图像名字,运用ArrayList数组进行存储,并由监听器进行监听

此处是关于鼠标、用户操作的监听器,和部分基本属性部分

class DrawListenerB implements MouseListener, ActionListener {/*ActionListener  接收操作事件的侦听器MouseListener   鼠标监听器*/int x,x1,y,y1;//设定两个点  矩形 圆都是两点决定的int x2,y2,x3,y3,x4,y4;String Shape = "";Color color;Graphics graphics = null;//调入Graphics图形上下文的抽象基类 也可以叫做绘图的画笔ArrayList<UtilityColor> arrayList = new ArrayList<>();//存储数组public void setGraphics(Graphics graphics) {this.graphics = graphics;}int count = 0;//计数器@Overridepublic void mouseClicked(MouseEvent e) {//鼠标点击时调用x = e.getX();  //返回事件相对于源组件的水平 x 坐标。y = e.getY();   //  返回事件相对于源组件的水平 y坐标。//尝试一下子点击的时候if(Shape.equals("三角形")){if(count == 0){x2 = x;y2 = y;count++;} else if(count == 1){x3 = x;y3 = y;graphics.drawLine(x2,y2,x3,x3);count++;} else if(count == 2){x4 = x;y4 = y;graphics.drawLine(x3,y3,x4,y4);graphics.drawLine(x4,y4,x2,y2);count=0;}}int button = e.getButton (); //返回更改了状态的鼠标按键}@Overridepublic void mousePressed(MouseEvent e) {//鼠标按下时调用x = e.getX();  //返回事件相对于源组件的水平 x 坐标。y = e.getY();   //  返回事件相对于源组件的水平 y坐标。}@Overridepublic void mouseReleased(MouseEvent e) {//鼠标释放的时候调用x1 = e.getX();  //返回事件相对于源组件的水平 x 坐标。y1 = e.getY();   //  返回事件相对于源组件的水平 y坐标。switch (Shape){case "直线":Line line = new Line(color,x,y,x1,y1,Shape);line.drawShape(graphics);arrayList.add(line);//添加到数组当中break;case "矩形":Rect rect = new Rect(color,x,y,x1,y1,Shape);rect.drawShape(graphics);arrayList.add(rect);break;case "圆" :Oval oval = new Oval(color,x,y,x1,y1,Shape);oval.drawShape(graphics);arrayList.add(oval);break;case "实心矩形" :Rect fillRect = new Rect(color,x,y,x1,y1,Shape);fillRect.drawShape(graphics);arrayList.add(fillRect);break;case "实心圆":Oval fillOvel = new Oval(color,x,y,x1,y1,Shape);fillOvel.drawShape(graphics);arrayList.add(fillOvel);break;//上述四种情况都相同,两个点确定一个图像,所以可以使用过相同的参数case "等腰三角形" :ABC abc = new ABC(color,x,y,x1,y1,Shape);abc.drawShape(graphics);arrayList.add(abc);break;//思路:以矩形为参照物,矩形中点为顶点,之后两个点就是Math.min(x,x1) Math.max(y,y1)//另一个点 Math.max(x,x1),Math.max(y,y1)default:break;}}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}@Overridepublic void actionPerformed(ActionEvent e) {MyButton myButton = (MyButton) e.getSource(); //get最初发生 Event 的对象int buttonId = myButton.getButtonId();//在接收事物监听器中判断接收的是颜色还是图像if(buttonId == MyButton.TYPE_SHAPE){Shape  = myButton.getText();System.out.println(Shape);}else if(buttonId == MyButton.TYPE_COLOR) {System.out.println("颜色点击按钮");color = myButton.getBackground();graphics.setColor(color);}}
}
class MyButton extends JButton{//设定识别是否为颜色/图形设定相关变量private int ButtonId;public void setButtonId(int buttonId) {ButtonId = buttonId;}public  static final int TYPE_SHAPE=1;//若为1就是图像public  static final int TYPE_COLOR=0;//为0就是颜色public MyButton() {super("");}public MyButton(String text) {super(text);}

上面这个是关于上面代码块的判断图像和颜色的部分

4、重写paint()方法

public void paint(Graphics graphics){super.paint(graphics);//重写paint方法重绘,这里会把画的图像地址保存到数组当中for (UtilityColor utilityColor : drawListenerA.arrayList) {utilityColor.drawShape(graphics);}}

5、把这写方法写到添加到主函数的无参方法中(方便调用)

public class DrawTest02 extends JFrame{DrawListenerB drawListenerA = new DrawListenerB();public void DrawTest02(){JFrame jframe = new JFrame("画板");JFrame jFrame = this;jframe.setSize(1000,800);jframe.setDefaultCloseOperation(EXIT_ON_CLOSE);jframe.setLocationRelativeTo(null);//设定画板页面中间jframe.setLayout(new FlowLayout());//创建流布局,自动根据窗口大小排列//设定按钮String  [] str = {"直线","矩形","圆","实心矩形","实心圆","等腰三角形","三角形","多边形"};for (int i = 0; i < str.length; i++) {MyButton myButton = new MyButton(str[i]);myButton.setButtonId(MyButton.TYPE_SHAPE);myButton.addActionListener(drawListenerA);//将监听器局部变量放到按钮中jframe.add(myButton);//把String数组中的东西呈现在窗口上}Color [] color = new Color[]{//添加颜色板块Color.BLACK,Color.BLUE,Color.GREEN,Color.LIGHT_GRAY,Color.ORANGE,Color.RED, Color.CYAN,Color.MAGENTA};//添加按钮功能for (int i = 0; i < color.length; i++) {MyButton myButton = new MyButton();myButton.setBackground(color[i]);myButton.setButtonId(MyButton.TYPE_COLOR);//此行由于没写其构造方法,所以运行前写不到面板上myButton.addActionListener(drawListenerA);myButton.setPreferredSize(new Dimension(50,50));//设定颜色板块大小jframe.add(myButton);}jframe.setVisible(true);//设定数据可视化开关jframe.addMouseListener(drawListenerA);//添加监听的对象drawListenerA.setGraphics(jframe.getGraphics());
//         为组件创建一个图形上下文。}

6、最后调用主函数

public static void main(String[] args) {new DrawTest02().DrawTest02();}

图像展示


结语:当前写出来的画板和大家电脑上的画板还有很大的差距.....

之后慢慢完善吧ahhh,欢迎各位大佬指点(抱拳)!!!!

【无标题】Java画板简易实现相关推荐

  1. java画板铅笔_简易画板的JAVA实现

    要实现一个画图板,首先我们要掌握的是图形界面开发和事件监听机制.在Java中,图形界面开发有三套组件: 1.AWT组件:这是JDK1.0推出的图形组件类,位于java.awt这个包下.AWT组件被称为 ...

  2. Java swing简易浏览器(其二)前进后退与收藏夹实现

    [Java swing简易浏览器(其一)页面显示,超链接跳转与手动输入URL跳转] [Java swing简易浏览器(其二)前进后退与收藏夹实现] [java swing 简易浏览器(其三)下载器,智 ...

  3. Java命令简易入门-3:javac与java命令之(java与jar)

    Java命令简易入门-3:javac与java命令之二(java与jar) 文章目录 Java命令简易入门-3:javac与java命令之二(java与jar) 1. 实验环境与实验文件 2. Jav ...

  4. Android 无标题 全屏设置

    Android 无标题 全屏设置 标题栏和状态栏 Android程序默认情况下是包含状态栏和标题栏的. 在Eclipse中新建一个Android程序,运行后显示如下: 图中标出了状态栏(显示时间.电池 ...

  5. 基于Java实现简易的 注册 + 登录 系统 (中级)

    引言 :这个项目我以学习的角度进行补充和完善,力求把登录 + 注册做到最完美!!! 该项目适用于 学习完 基础的编程语法的同学进行进阶学习 [1]基于Java实现简易的 注册 + 登录 系统 非 数据 ...

  6. Java swing简易浏览器(其一)页面显示,超链接跳转与手动输入URL跳转

    [Java swing简易浏览器(其一)页面显示,超链接跳转与手动输入URL跳转] [Java swing简易浏览器(其二)前进后退与收藏夹实现] [java swing 简易浏览器(其三)下载器,智 ...

  7. 关于WM_NCHITTEST消息(移动无标题对话框多个)

    我为了移动一个无标题栏的窗体,使用了WM_NCHITTEST消息,这个消息大概如下: 通常,我们拖动对话框窗口的标题栏来移动窗口,但有时候,我们想通过鼠标在客户区上拖动来移动窗口. 一个容易想到的方案 ...

  8. 简单计算器的设计java_(基于java的简易计算器的设计.doc

    (基于java的简易计算器的设计 基于java的简易计算器的设计 摘要 自从java语言诞生以来,java语言就以不可抵挡的趋势很快成为国际上广泛流行的面向对象编程语言,它既具有高级语言的特点,又少了 ...

  9. mysql输入命令1002无标题_Linux下远程连接MySQL数据库的方法

    步骤 1.在服务器端开启远程访问 首先进入mysql数据库,然后输入下面两个命令: grant all privileges on *.* to 'root'@'%' identified by 'p ...

最新文章

  1. php 5.2.17 mysql_Apache 2.2.15 整合php 5.2.17 Mysql-5.5.8
  2. centos网络安装
  3. 食品安全溯源区块链解决方案探索-转载
  4. kubernetes入门到精通(二):k8s部署Tomcat集群,基于NTFS协议的文件集群共享,Service提供负载均衡,端口转发工具Rinetd配置外部访问
  5. RDLC报表系列--------钻取报表
  6. Daily Scrum 2012/11/08
  7. IBatis 映射文件 sql 中大于、小于等符号转义
  8. 这些面试题你需要知道
  9. 模拟Windows任务管理器CPU使用率的动态折线图-农夫山泉
  10. Android数据存储汇总
  11. 初识FL Studio中的FLEX插件
  12. 富士施乐Fuji Xerox DocuPrint M255 z 驱动
  13. hb100 微波雷达arduino_Arduino Microwave sensor微波传感器模块
  14. 计算机加入域无法访问登录,不加入域不能访问域资源
  15. linux 磁盘隔离,Linux 磁盘坏道故障修复
  16. 163个人邮箱你了解多少?如何注册下载163邮箱呢?
  17. Zalando在疫情中成为赢家,甚至超越了亚马逊
  18. The Moo Particle
  19. android电梯程序设计,[源码和文档分享]基于Android实现的电梯调度模拟
  20. WEB安全 TCP协议安全 应用安全 信息安全 业务安全 SDK嵌入式防护 等保 攻击溯源 CDN DCDN

热门文章

  1. python 白噪声检验-时间序列 平稳性检验 白噪声 峰度 偏度
  2. 用狄克斯特拉算法计算带权最短路径
  3. 那些与三维激光扫描有关的建模
  4. 三维触控测试软件,解读苹果3D touch三维触控技术
  5. 记Aspose.Word的使用中出现的问题
  6. 【前端面试指南】简历上的前端常用单词,你拼写对了吗?
  7. 国家气候气象观测站分类
  8. 从前台获取数据,并导出PDF文件
  9. C/S构架和B/S构架
  10. 《微型计算机原理与接口技术》期末总复习 —— 一篇匆匆忙忙的复习笔记