用 JAVA 实现画板
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 实现画板相关推荐
- Java创意画板初步
** Java创意画板初步 ** Swing 体系 样例工具 SwingSet2.jar 下载链接:https://download.csdn.net/download/qq_41892714/108 ...
- 简显易懂的TCP网络通信零起步(java网络画板,山寨腾讯会议)
之前写过一篇QT实习日志,把自己实训期间的学习过程全部记录下来了,近段时期开始学习网络编程相关知识,决定换一种形式,把自己对TCP/通信相关知识讲得大家容易理解一点,欢迎大家交流. 目录 内容简介 快 ...
- Java绘画板源码_Java 绘图板 示例源码下载(画板)
Java 绘图板 示例源码下载(画板) java 2020-8-21 下载地址 https://www.codedown123.com/36795.html package minidrawpad; ...
- java创建画板_Java版画板的实现方法
Windows的画图板相信很多人都用过,这次我们就来讲讲Java版本的简易画板的实现. 基本的思路是这样的:画板实现大致分三部分:一是画板界面的实现,二是画板的监听以及画图的实现,三是画板的重绘.(文 ...
- java 高级画板_fabric.js和高级画板
本文介绍fabric.js框架使用,以及使用fabricjs打造一个高级画板程序. 高级画板功能介绍 全局绘制颜色选择 护眼模式.网格模式切换 自由绘制 画箭头 画直线 画虚线 画圆/椭圆/矩形/直角 ...
- java创建画板_java画板的设计和创建
首先创建一个画板类继承容器类,这样可以在画板类中重写容器的paint方法. public class DrawFrame extends JPanel 再创建一个类写监听器的程序,以及一个类来写画板的 ...
- Java第n次入门之画板的实现
本次我们主要实现了一个画板的工具,具体功能有画固定图形(直线.矩形等java自带画图方法).曲线.立体图.分形图.概率画图.递归画图以及画笔颜色切换. 下面我们逐步介绍. 一,窗体及按钮的可视化实现 ...
- Java小程序——模仿Win系统画板
好久之前的一个小作业,用Java实现画板.毕竟当时花费不少功夫调试,在这里分享给大家,希望能够对需要的小伙伴有所帮助!声明一下,以下代码为参考网上相关代码修改,绝非完全原创. 运行效果图如下: 话不多 ...
- java 横版游戏开发_用MyEclipse的Java Project开发仿DNF横版格斗游戏
这些天,我正在用MyEclipse的Java Project开发一款仿DNF 横版格斗游戏. http://v.youku.com/v_show/id_XMTI5MTE0NDg4MA==.html 这 ...
最新文章
- 从JAVA转学习Go——Go在eclipse的环境搭建
- [转]LIB和DLL的区别与使用
- hdu 5592 ZYB's Premutation (线段树+二分查找)
- 有哪些工具可以让嵌入式开发事半功倍?详细盘点工程师必备工具
- Java元数据区的概念_java之元数据(metadata)-Go语言中文社区
- 认证考试介绍之RHCE篇
- 404. Sum of Left Leaves
- 媒体控件的播放暂停继续与停止 winform
- Linux重要的热键[Tab]、[Ctrl]-c、[Ctrl]-d介绍
- springMVC的文件上传于下载
- 广州爱立信java笔试题_爱立信笔试经历
- socat使用指南:3:5种常见的使用方法
- 通过QQ 2012 客户端协议获取clientkey的0x30数据包分析
- 【乌拉圭】乌拉圭决定采用日本-巴西数字电视制式标准
- NTFS磁盘读写工具Mounty 1.9 Mac免费版
- 一周AI要闻回顾 | FB新研究颠覆CNN,加州新政允许无人卡车路测
- python寻峰,[LeetCode][Python]162. 寻找峰值
- JSP酒店管理系统myeclipse开发mysql数据库bs框架java编程jdbc详细设计
- python修改桌面壁纸_利用Python对windows桌面自动更换壁纸
- omnet java_omnet++4.0安装使用