接触java不满一个月,看厚厚的java入门简直要醉,故利用实例来巩固所学知识。
画板的实现其实从原理来说超级简单,可能一会儿就完成了。
但作为一名强迫症患者,要实现和win下面的画板一样的功能还是需要动下脑筋的。

画板雏形:
画板顾名思义,最主要功能就是要来画画的

Java里面的Graphics类里面提供了如下几种方法。
画圆画方画直线都不成问题,只需要提x1,x2,y1,y2即可。
在窗体上加个监听器,在mousePressed时用getX()和getY()获取x1,y1,在mouseReleased时用getX()和getY()获取x2,y2就完成了最简单的画板。

多边形:
多边形如何画呢,win下的画图板通过点击一处放置一个点,再点击一处放置另一个点,双击连接第一个点的和最后一个点完成绘制多边形。
利用以上思路,可以整理为,在mouseClicked时记录点的位置,若是第一个点,则要保存到一个固定的参数,若是其他点,则通过g.drawLine来连接上一个点和这个点,最后通过e.getClickCount()方法来获得是否双击来判断是否需要连接当前点和第一个点。

界面:
窗体的设计非常简单。其中按钮可以用循环来放置。加入监听器后可以通过e.getActionCommand()来获取按钮上的字符串。颜色按钮则可以通过新建一个JButton并利用getSource获取按下的Button,再利用JButton里面的getBackground获取颜色。
最后在本地p个图,利用下边界布局即可获得初级的界面。
最后再在可以绘画的位置加一个Panel,并从窗体获取graphics变成从该Panel获取,监听器改到该Panel下就可以保证画图的部分不会超过绘图区域了。
完成效果如下。

============华丽丽的分割线 强迫症从这里开始==============

画板的基本功能已经实现,但是作为一个强迫症怎么能够满足于鼠标拖拽时最后才凭空冒出来的一根线?

画板改进:
加入MouseMotionListener监听器
MouseMotionListener提供了两种方法
一个鼠标移动,一个是鼠标拖拽。
要想画直线拖拽鼠标的时候有一条实实在在的直线跟在后面跑,岂不是直接在mouseDragged时getx、y然后画出来就好了……于是就变成了这样:

初看觉得美美哒,而且它确确实实画了 不过每移动一点点位置就画了……
解决方案很容易就想到,每次画新的前,用背景色把上一条再画一遍不就好了。于是一条直线的拖拽就做好了。
然而当画第二条直线和第一条相交的时候……把第一条擦掉了是什么鬼!!!!!!!

想到两条解决方法~
1.把画板每个像素的涂色状态用二维数组来储存,然后每次画完一个图形都跟新一次数组。清空时把整个数组清0即可。该方法可能可以通过把现在画的通过BufferedImage中的createGraphyics形成graphycis tmp,然后画在tmp上,最后在读取图片数据来实现。不过貌似好麻烦……舍去。、
2.每画完一笔生成一个图片,然后把背景改成这个,然后再画……额 这个感觉还是有种治标不治本的感觉……舍去。
3.建立链表!!把所有的数据都保存在链表里面去!!然后每次画一笔就从头开始把刚才画的所有东西都画一遍。

由于是初学者,而且第一次在Java上实现链表,于是就按照自己对链表的理解,写了节点如下

package com.frame;import java.awt.Color;
import java.awt.Graphics;public class PaintedList {private String cmd;private DuoList PLi;private int x1, y1, x2, y2;private DuoList li;private PaintedList next;private Color color;public DuoList getPLi() {return PLi;}public void setPLi(DuoList pLi) {PLi = pLi;}public Color getColor() {return color;}public void setColor(Color color) {this.color = color;}public String getCmd() {return cmd;}public void setCmd(String cmd) {this.cmd = cmd;}public PaintedList getNext() {return next;}public void setNext(PaintedList next) {this.next = next;}public int getX1() {return x1;}public void setX1(int x1) {this.x1 = x1;}public int getY1() {return y1;}public void setY1(int y1) {this.y1 = y1;}public int getX2() {return x2;}public void setX2(int x2) {this.x2 = x2;}public int getY2() {return y2;}public void setY2(int y2) {this.y2 = y2;}public DuoList getLi() {return li;}public void setLi(DuoList li) {this.li = li;}public void paint(Graphics g) {g.setColor(color);if (cmd.equals("直线")) {g.drawLine(x1, y1, x2, y2);} else if (cmd.equals("椭圆")) {g.drawOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2));} else if (cmd.equals("矩形")) {g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2));} else if (cmd.equals("三角形")) {g.drawLine(x1, y1, x2, y2);g.drawLine(x2, y2, x2 - Math.abs(x2 - x1) * 2, y2);g.drawLine(x2 - Math.abs(x2 - x1) * 2, y2, x1, y1);} else if (cmd.equals("多边形")) {PLi = li;while (PLi.getnext() != null) {PLi.printline(g);PLi = PLi.getnext();}}}
}

多边形也用链表保存了所有的节点

package com.frame;import java.awt.Graphics;public class DuoList {private int x;private int y;private DuoList next;public int getx() {return this.x;}public int gety() {return this.y;}public void setx(int x) {this.x = x;}public void sety(int y) {this.y = y;}public void setnext(DuoList next) {this.next = next;}public DuoList getnext() {return this.next;}public void printline(Graphics g) {if (this.getnext() != null) {g.drawLine(x, y, next.getx(), next.gety());}}
}

值得注意的一点是,由于Java没有指针啥的,每次用完一个节点,在利用这个变量名之前要new一下,相当于malloc一个新的储存空间。

窗体的代码

package com.frame;import java.awt.*;import javax.swing.*;public class Frame extends JFrame {/*** */private static final long serialVersionUID = 1L;public Frame() {MouseAction m = new MouseAction();String[] kind = new String[] { "直线", "矩形", "椭圆", "三角形", "多边形", "清空" };Color[] color = { Color.black, Color.BLUE, Color.GREEN, Color.YELLOW };this.setSize(827, 647);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setBackground(Color.lightGray);this.setLocationRelativeTo(null);this.setResizable(false);this.setLayout(new BorderLayout());ImageIcon im = new ImageIcon("image/bg.jpg");JLabel jla = new JLabel(im);this.getLayeredPane().add(jla, new Integer(Integer.MIN_VALUE));jla.setBounds(0, 0, 827, 627);JPanel jpanel = (JPanel) this.getContentPane();jpanel.setOpaque(false);JPanel west = new JPanel();west.setPreferredSize(new Dimension(189, 0));JPanel tmp1 = new JPanel();tmp1.setPreferredSize(new Dimension(189, 120));tmp1.setOpaque(false);JPanel tmp2 = new JPanel();tmp2.setPreferredSize(new Dimension(18, 0));tmp2.setOpaque(false);JPanel westcenter = new JPanel();westcenter.setOpaque(false);west.setLayout(new BorderLayout());west.add(tmp1, BorderLayout.NORTH);west.add(tmp2, BorderLayout.WEST);west.add(westcenter, BorderLayout.CENTER);for (int i = 0; i < kind.length; i++) {JButton jbu = new JButton(kind[i]);jbu.setBorderPainted(false);jbu.setFont(new Font("楷体", 15, 15));jbu.setPreferredSize(new Dimension(130, 40));jbu.setBackground(Color.orange);westcenter.add(jbu, BorderLayout.CENTER);jbu.addActionListener(m);}for (int i = 0; i < color.length; i++) {JButton jbu = new JButton();jbu.setBorderPainted(false);jbu.setBackground(color[i]);jbu.setPreferredSize(new Dimension(130, 40));westcenter.add(jbu, BorderLayout.CENTER);jbu.addActionListener(m);}west.setOpaque(false);this.add(west, BorderLayout.WEST);JPanel east = new JPanel();east.setPreferredSize(new Dimension(630, 0));this.add(east, BorderLayout.EAST);east.setOpaque(false);east.setLayout(null);JPanel board = new JPanel();board.setBounds(23, 28, 589, 567);// board.setBackground(Color.black);board.setOpaque(false);east.add(board);this.setVisible(true);Graphics g = board.getGraphics();board.addMouseListener(m);board.addMouseMotionListener(m);m.setGraphics(g);m.setJFrame(this);}
}

鼠标以及事件监听器的代码

package com.frame;import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JButton;
import javax.swing.JFrame;public class MouseAction implements MouseListener, ActionListener, MouseMotionListener {private Graphics g;private int time = 0;private int x1, x2, y1, y2, oldx1, oldy1, curx1, cury1, flag = 0, x3, y3;private DuoList Li = new DuoList();private DuoList FLi = new DuoList();private DuoList PLi = new DuoList();private PaintedList ALLi = new PaintedList();private PaintedList FALLi = new PaintedList();private PaintedList PALLi = new PaintedList();public DuoList TMP;public PaintedList tmppaint = new PaintedList();public PaintedList tmppaint2 = new PaintedList();private int flag1 = 0;private String cmd = "直线";private Color color = Color.black;private JFrame frame;public void setJFrame(JFrame frame) {this.frame = frame;}public void setGraphics(Graphics g) {this.g = g;}public void mouseClicked(MouseEvent e) {TMP = new DuoList();tmppaint = new PaintedList();tmppaint2 = new PaintedList();if (cmd.equals("多边形")) {time = e.getClickCount();if (time == 2 && flag == 1) {flag = 0;g.drawLine(curx1, cury1, oldx1, oldy1);if (flag1 == 0) {ALLi.setLi(Li);ALLi.setColor(color);ALLi.setCmd(cmd);tmppaint.setX1(curx1);tmppaint.setX2(oldx1);tmppaint.setY1(cury1);tmppaint.setY2(oldy1);tmppaint.setColor(color);tmppaint.setCmd("直线");tmppaint.setNext(null);ALLi.setNext(tmppaint);FALLi = tmppaint;flag1 = 1;Li = new DuoList(); // 一定要new一个FLi = new DuoList();PLi = new DuoList();} else {tmppaint.setLi(Li);tmppaint.setCmd(cmd);tmppaint.setColor(color);tmppaint2.setX1(curx1);tmppaint2.setX2(oldx1);tmppaint2.setY1(cury1);tmppaint2.setY2(oldy1);tmppaint2.setColor(color);tmppaint2.setCmd("直线");tmppaint2.setNext(null);FALLi.setNext(tmppaint);tmppaint.setNext(tmppaint2);FALLi = tmppaint2;Li = new DuoList();FLi = new DuoList();PLi = new DuoList();}} else {if (flag == 0) {flag = 1;oldx1 = e.getX();curx1 = oldx1;oldy1 = e.getY();cury1 = oldy1;Li.setx(oldx1);Li.sety(oldy1);FLi = Li;PLi = Li;FLi.setnext(null);} else {FLi.setnext(TMP);curx1 = e.getX();cury1 = e.getY();TMP.setx(curx1);TMP.sety(cury1);TMP.setnext(null);FLi = TMP;g.setColor(color);}}x3 = curx1;y3 = cury1;}}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}public void mousePressed(MouseEvent e) {x1 = e.getX();x3 = x1;y1 = e.getY();y3 = y1;g.setColor(color);System.out.println(x1 + " " + y1);}public void mouseReleased(MouseEvent e) {final PaintedList tmppaint = new PaintedList();x2 = e.getX();y2 = e.getY();if (cmd.equals("直线")) {g.drawLine(x1, y1, x2, y2);} else if (cmd.equals("椭圆")) {g.drawOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2));} else if (cmd.equals("矩形")) {g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2));} else if (cmd.equals("三角形")) {g.drawLine(x1, y1, x2, y2);g.drawLine(x2, y2, x2 - Math.abs(x2 - x1) * 2, y2);g.drawLine(x2 - Math.abs(x2 - x1) * 2, y2, x1, y1);}if (cmd.equals("多边形")) {} else {if (flag1 == 0) {ALLi.setX1(x1);ALLi.setX2(x2);ALLi.setY1(y1);ALLi.setY2(y2);ALLi.setCmd(cmd);ALLi.setColor(color);ALLi.setNext(null);FALLi = ALLi;flag1 = 1;} else {FALLi.setNext(tmppaint);tmppaint.setX1(x1);tmppaint.setX2(x2);tmppaint.setY1(y1);tmppaint.setY2(y2);tmppaint.setColor(color);tmppaint.setCmd(cmd);tmppaint.setNext(null);FALLi = tmppaint;}PALLi = ALLi;if (flag1 != 0) {while (PALLi != null) {PALLi.paint(g);PALLi = PALLi.getNext();}}}}@Overridepublic void actionPerformed(ActionEvent e) {if (e.getActionCommand().equals("")) {JButton jbu = (JButton) e.getSource();color = jbu.getBackground();} else {cmd = e.getActionCommand();}if (cmd.equals("清空")) {frame.repaint();flag = 0;flag1 = 0;cmd = "直线";}}@Overridepublic void mouseDragged(MouseEvent e) {if (cmd.equals("直线")) {g.setColor(Color.WHITE);g.drawLine(x1, y1, x3, y3);x3 = e.getX();y3 = e.getY();g.setColor(color);g.drawLine(x1, y1, x3, y3);} else if (cmd.equals("椭圆")) {g.setColor(Color.WHITE);g.drawOval(Math.min(x1, x3), Math.min(y1, y3), Math.abs(x1 - x3), Math.abs(y1 - y3));x3 = e.getX();y3 = e.getY();g.setColor(color);g.drawOval(Math.min(x1, x3), Math.min(y1, y3), Math.abs(x1 - x3), Math.abs(y1 - y3));} else if (cmd.equals("矩形")) {g.setColor(Color.WHITE);g.drawRect(Math.min(x1, x3), Math.min(y1, y3), Math.abs(x1 - x3), Math.abs(y1 - y3));x3 = e.getX();y3 = e.getY();g.setColor(color);g.drawRect(Math.min(x1, x3), Math.min(y1, y3), Math.abs(x1 - x3), Math.abs(y1 - y3));} else if (cmd.equals("三角形")) {g.setColor(Color.WHITE);g.drawLine(x1, y1, x3, y3);g.drawLine(x3, y3, x3 - Math.abs(x3 - x1) * 2, y3);g.drawLine(x3 - Math.abs(x3 - x1) * 2, y3, x1, y1);g.setColor(color);x3 = e.getX();y3 = e.getY();g.drawLine(x1, y1, x3, y3);g.drawLine(x3, y3, x3 - Math.abs(x3 - x1) * 2, y3);g.drawLine(x3 - Math.abs(x3 - x1) * 2, y3, x1, y1);}PALLi = ALLi;if (flag1 != 0) {while (PALLi != null) {PALLi.paint(g);PALLi = PALLi.getNext();}}}@Overridepublic void mouseMoved(MouseEvent e) {if (cmd.equals("多边形") && flag == 1) {g.setColor(Color.WHITE);g.drawLine(curx1, cury1, x3, y3);g.setColor(color);x3 = e.getX();y3 = e.getY();g.drawLine(curx1, cury1, x3, y3);while (PLi != null) {PLi.printline(g);PLi = PLi.getnext();}PLi = Li;PALLi = ALLi;if (flag1 != 0) {while (PALLi != null) {PALLi.paint(g);PALLi = PALLi.getNext();}}}}}

主函数

package com.main;import com.frame.Frame;public class Game {public static void main(String[] args) {new Frame();}
}

后附一张background

Java学习记录 : 画板的实现相关推荐

  1. java多线程阶乘_【java学习记录】11.用多线程实现阶乘的计算过程和结果的读取(thread类ReadThread )...

    (源码在上传的压缩包"[java学习记录]11.多线程实现阶乘计算(Thread类和Runnable接口)"中可看到,该压缩包可下载)java * 采用Thread类的子类实现线程 ...

  2. java学习记录十五:集合二Collections、Set、Map

    java学习记录十五:集合二 一.Collections工具类 一.解释 二.常用方法 1.打乱集合顺序 2.按照默认规则排序 3.按指定规则排序 4.批量添加元素 二.可变参数 一.解释 二.写法 ...

  3. Java学习记录五(多线程、网络编程、Lambda表达式和接口组成更新)

    Java学习记录五(多线程.网络编程.Lambda表达式和接口组成更新) Java 25.多线程 25.1实现多线程 25.1.1进程 25.1.2线程 25.1.3多线程的实现 25.1.4设置和获 ...

  4. java学习记录16-反射

    java学习记录 一.什么叫反射? 二.测试class类的创建方式有哪些 三.类加载内存分析 加载->链接->初始化 四.分析类的初始化 五.获得类的信息 六.动态的创建对象,通过反射 七 ...

  5. Java学习记录02

    Java学习记录02 在学习中,博客的书写不可缺少,相应的markdown基本语法也要掌握,下面是自己在CSDN上查找并学习的链接:Markdown语法 2.6项目实训:基于控制台设计简易打折与累加计 ...

  6. Java学习记录_1:MOOC《零基础学Java语言》课后习题解

    Hey,我是寒水,一名大二学生,电子商务专业在读,正在学习Java中.我试图将在Java学习中遇到的一些困惑和最终的解答发在这个账号上,希望以此来激励我不要放弃学习! 在学习记录这个专题中,我收藏一些 ...

  7. Java学习记录之简单的图书管理系统(完善中)

    电子书管理系统 功能划分 最核心的功能 提供图书管理的服务 添加图书 查询 检索所有的图书 按已知检索图书信息 图书的删除 图书信息的更新 用户 用户的类型 管理员:图书的添加.更新.删除操作 普通用 ...

  8. Java学习记录:Java飞机大战进阶版(敌人有子弹、有生命、有boss、有声音、还有大招一键清屏)

    Java飞机大战 序言 一.项目需求分析 二.各个对象类的设计 加载图片类Images 抽象类FlyingObject 天空类Sky 小敌机类Airplane 大敌机类BigAirplane 侦察机类 ...

  9. Java学习记录(Day4)

    学习Java第四天 单例模式 三元素: 构造结构私有化 静态属性指向实例 public static的 getInstance方法,返回第二步的静态属性 饿汉式单例模式 GiantDragon 应该只 ...

最新文章

  1. Android官方网站
  2. Taro+react开发(77):taro项目目录介绍
  3. 【网络信息安全】密码学入门笔记
  4. IOS关于UIViewController之间的切换
  5. poster模板_高分北斗大赛报名进行中,ppt、poster展示模板推送
  6. 国内第三个双机场城市新机场试飞,6月正式投用
  7. 使用Scikit Learn的分类器探索Iris数据集
  8. acl 影响因子_适合理论、计算化学投稿的期刊及其2016年影响因子(2017年公布)...
  9. 深度解读:2021 中国低代码平台发展现状
  10. 电商扣减库存_什么样的电商产品经理更值钱?先解决这个难题!
  11. 手机怎样设置每年自动生日提醒
  12. pandas.Series.str.extract 正则提取数据
  13. Mac 上简体中文输入方式的键盘快捷键
  14. 如何生成多个互不重叠的不同半径圆(逻辑)
  15. linux自动补全命令插件,vim自动补全插件snipMate
  16. 浏览器帧率(fps)对比:QQ,Firefox,Chrome,Edge
  17. 制造企业如何通过APS智能排产进行生产计划规划?
  18. 酒店 read.php,【京邦会议案例】吴江黎花建国度假酒店
  19. (一)库存计划-安全库存
  20. 外部系统接口稽核经验谈

热门文章

  1. jQuery是什么?
  2. Nachos之系统调用
  3. java实现平衡二叉树
  4. conda与Anaconda
  5. 配置apache以fastcgi运行php
  6. 谷歌PR权重 Google PR与百度权重
  7. pacman.conf文件
  8. 2018-2019-2 20175317 实验三《敏捷开发与XP实践》实验报告
  9. python京东抢购软件_[Python] 京东秒杀商品抢购-茅台抢购自动获取抢购时间【修改】...
  10. 音视频技术开发周刊 79期