1、用什么画

java.awt中有一个类,叫做Graphics。这个类有很多可以在组件(java.awt.Component类及它的子类)上绘制图形的方法。这个类在功能上像画笔。

所有组件(Component)类都有一个方法,叫做getGraphics()。如果一个组件已经显示(setVisible(true)),getGraphics()会返回一个与该组件对应的Graphics对象;否则返回null

java.awt.event中有一些监听器。MouseMotionListener可以监听鼠标拖动(drag,按下鼠标主键同时拖动)时的坐标。MouseListener可以监听鼠标的按下、点击、释放时的坐标。

2、Graphics 类中的方法

下面是 Graphics 类中常用的绘图方法。参数列表中的坐标的坐标原点,在Graphics对象所对应的组件中。横、纵轴的正方向分别是右、下。

返回值类型 方法名  和  参数列表 描述
void drawLine (int x1, int y1, int x2, int y2) 在点 (x1, y1) 和 (x2, y2) 之间画一条线。
void drawOval (int x, int y, int width, int height) 绘制椭圆的轮廓。
void drawRect (int x, int y, int width, int height) 绘制矩形的轮廓。
void drawString (String str, int x, int y) 绘制由指定 string 给定的文本。

Graphics 类中还有 setColor() getColor() setFont() getFont() 四个方法,可以更改、获取画笔的颜色和字体。

3、画板的简单功能的实现

3.1 直线

这有什么难的咯

3.2 自由曲线

曲线可以看成是许多段极短的直线段首尾相接连成的。可以在鼠标拖动时,连续不停地记录鼠标的坐标、并画出连续的直线段。

class Listener implements MouseListener, MouseMotionListener {private int x1, x2, y1, y2;private Graphics graphics;//...public void mouseDragged(MouseEvent e) {x2 = e.getX(), y2 = e.getY();graphics.drawLine(x1, y1, x2, y2);x1 = x2;y1 = y2;}
}

3.3 橡皮擦

擦除图像就是在指定的位置画出线条的过程。只不过线条的颜色是背景色。所以要先设定画板背景色,因为默认的背景色不是白色。
Graphics 默认的笔触很小。可以用下面的代码增大 Graphics 的笔触。

int size;
//...
Graphics2D g = (Graphics2D) graphics;
g.setStoke(new BasicStoke(size));   // size 是表示笔触大小的整数。原来为 1

3.4 椭圆和矩形

在调用 drawOval() 和 drawRect() 时,要把图形的左上角的坐标作为参数。但是我们不知道用户会不会按↙和↗方向来拖动鼠标,所以我们要先处理坐标。

private int min(int a, int b) {return a < b ? a : b;
}private int abs(int a) {return a < 0 ? -a : a;
}//...
drawOval(min(x1, x2), min(y1, y2), abs(x1 - x2), abs(y1 - y2));

3.5 笔触颜色

setColor()方法即可。

可以在界面上创建多个按钮,更改它们的背景色。同时,让按钮的监听器记录按钮的背景色即可。

Color color;
//...
public void actionPerformed(ActionEvent e) {color = ((JButton) e.getObject()).getBackground();
}

4、图形动态预览

我们希望,我们在拖动鼠标的时候就能即时看到图形的效果,还希望图形的预览效果是随着鼠标的拖动实时变化的。

然而现在的画板只有在释放鼠标之后才会显示图形。没有预览效果,我们就不知道图形有没有画歪。

一个很朴素的想法是, 在拖动的时候就把图形画出来。每当鼠标坐标改变,就用背景色擦除上一次画出的预览效果,然后再画一次新的预览效果。

不难想到,拖动鼠标时,画板上会多出很多白色的线。这些白色的线可能会遮挡原先画好的图形。

另一个很朴素的想法是,把先前已经画好的图形全部记录下来。每一次画出白线之后,就把之前记录的图形重新画出来。

Java 没有现成的类来记录这些图形。所以要自己定义一个类。

class Shape {int x1, y1, x2, y2, color, type;  // type 记录图形的种类// 下面写构造方法,这里略去。
}

然后我们就可以用这个类的对象的数组来记录图形了。

5、paint()方法

在 Java 中,能够显示出来的组件,都是由 Graphics 类的对象来绘制出来的。当我们让一个组件或者使一个最小化/被遮挡的组件变为可见时,它的 paint() 方法会被调用,这个方法会重新绘制组件。

返回值类型 方法名  和  参数列表 描述 访问权限
void paint (Graphics g) g重新绘制组件 public

如果画板上原来已经画了图形,我们再点最小化,然后最大化,这个窗体上的所有组件都会被重新绘制一遍。重新绘制的组件就会遮挡原有的图形。

为了让被遮挡的图形重新显示,应该重写paint()方法,让组件在重新绘制之后,把原有的图形也画上去。

class PaintBoard extends JPanel {//...public void paint(Graphics g) {super.paint(g); // 先调用基类的方法,绘制组件。for(Shape s : arr) { // arr 类型是 Shape[]paint(s); // 画出图形    这里的 paint() 是自己定义的方法}}
}

super是指代基类的关键字。

用 JAVA 实现画板相关推荐

  1. Java创意画板初步

    ** Java创意画板初步 ** Swing 体系 样例工具 SwingSet2.jar 下载链接:https://download.csdn.net/download/qq_41892714/108 ...

  2. 简显易懂的TCP网络通信零起步(java网络画板,山寨腾讯会议)

    之前写过一篇QT实习日志,把自己实训期间的学习过程全部记录下来了,近段时期开始学习网络编程相关知识,决定换一种形式,把自己对TCP/通信相关知识讲得大家容易理解一点,欢迎大家交流. 目录 内容简介 快 ...

  3. Java绘画板源码_Java 绘图板 示例源码下载(画板)

    Java 绘图板 示例源码下载(画板) java 2020-8-21 下载地址 https://www.codedown123.com/36795.html package minidrawpad; ...

  4. java创建画板_Java版画板的实现方法

    Windows的画图板相信很多人都用过,这次我们就来讲讲Java版本的简易画板的实现. 基本的思路是这样的:画板实现大致分三部分:一是画板界面的实现,二是画板的监听以及画图的实现,三是画板的重绘.(文 ...

  5. java 高级画板_fabric.js和高级画板

    本文介绍fabric.js框架使用,以及使用fabricjs打造一个高级画板程序. 高级画板功能介绍 全局绘制颜色选择 护眼模式.网格模式切换 自由绘制 画箭头 画直线 画虚线 画圆/椭圆/矩形/直角 ...

  6. java创建画板_java画板的设计和创建

    首先创建一个画板类继承容器类,这样可以在画板类中重写容器的paint方法. public class DrawFrame extends JPanel 再创建一个类写监听器的程序,以及一个类来写画板的 ...

  7. Java第n次入门之画板的实现

    本次我们主要实现了一个画板的工具,具体功能有画固定图形(直线.矩形等java自带画图方法).曲线.立体图.分形图.概率画图.递归画图以及画笔颜色切换. 下面我们逐步介绍. 一,窗体及按钮的可视化实现 ...

  8. Java小程序——模仿Win系统画板

    好久之前的一个小作业,用Java实现画板.毕竟当时花费不少功夫调试,在这里分享给大家,希望能够对需要的小伙伴有所帮助!声明一下,以下代码为参考网上相关代码修改,绝非完全原创. 运行效果图如下: 话不多 ...

  9. java 横版游戏开发_用MyEclipse的Java Project开发仿DNF横版格斗游戏

    这些天,我正在用MyEclipse的Java Project开发一款仿DNF 横版格斗游戏. http://v.youku.com/v_show/id_XMTI5MTE0NDg4MA==.html 这 ...

最新文章

  1. 从JAVA转学习Go——Go在eclipse的环境搭建
  2. [转]LIB和DLL的区别与使用
  3. hdu 5592 ZYB's Premutation (线段树+二分查找)
  4. 有哪些工具可以让嵌入式开发事半功倍?详细盘点工程师必备工具
  5. Java元数据区的概念_java之元数据(metadata)-Go语言中文社区
  6. 认证考试介绍之RHCE篇
  7. 404. Sum of Left Leaves
  8. 媒体控件的播放暂停继续与停止 winform
  9. Linux重要的热键[Tab]、[Ctrl]-c、[Ctrl]-d介绍
  10. springMVC的文件上传于下载
  11. 广州爱立信java笔试题_爱立信笔试经历
  12. socat使用指南:3:5种常见的使用方法
  13. 通过QQ 2012 客户端协议获取clientkey的0x30数据包分析
  14. 【乌拉圭】乌拉圭决定采用日本-巴西数字电视制式标准
  15. NTFS磁盘读写工具Mounty 1.9 Mac免费版
  16. 一周AI要闻回顾 | FB新研究颠覆CNN,加州新政允许无人卡车路测
  17. python寻峰,[LeetCode][Python]162. 寻找峰值
  18. JSP酒店管理系统myeclipse开发mysql数据库bs框架java编程jdbc详细设计
  19. python修改桌面壁纸_利用Python对windows桌面自动更换壁纸
  20. omnet java_omnet++4.0安装使用

热门文章

  1. Deployer 使用问题
  2. Mac微信多开与微信防撤回分享
  3. 中国越野汽车电子市场趋势报告、技术动态创新及市场预测
  4. _WIN32_WINNT not defined
  5. Notion学习笔记(一):用Notion写markdown
  6. luckysheet报错
  7. OLED屏幕的IIC驱动程序
  8. M域、B域、O域分别指什么?
  9. 问题-ListView 使用的时候,已经遇到的问题;
  10. JDK 17:Java 17 中的新特性