简介
作者简介:青铜码农,和大多数同学一样从零开始一步步学习,一步步积累。期待您的关注,让我们一起成长~注:本人学疏才浅,文章如有错误之处,敬请指正~
本章节内容简介:仿Windows系统自带的画图工具。此项目包含了设置画笔粗细、选择画笔颜色、选择背景颜色、绘制图像、清除图像、使用橡皮擦、简笔画窗口等功能。
所需技术如下图:
功能预览:
画图完整版视频
功能结构:
搭建项目
01导入资源
02创建DrawPictureFrame窗体类
03创建DrawPictureCanvas画板类
04添加鼠标画笔功能
05添加工具栏
06添加菜单栏
07实现添加水印功能
08添加鼠标效果
09添加简笔画对照窗口
实现过程
一、导入外部Jar包
DrawUtil.mr.Jar包中的类说明:
com.mr.util.BackgroundPanel:可以添加背景图片的面板类
com.mr.util.DrawImageUtil:绘图工具类,提供保存图片的方法
com.mr.util.FrameGetShape:兼容图形选择组件接口
com.mr.util.Shapes:图形选择组件返回的图形类
com.mr.util.ShapeWindow:图形选择组件类
二、创建可视窗体
创建DrawPictureFrame.java这个类,并将下面代码输入到类中:
/**
* 画图主窗体。
*/
public class DrawPictureFrame extends JFrame {// 继承窗体类
/**
* 构造方法。
*/
public DrawPictureFrame() {
ImageIcon imageIcon = new ImageIcon("src/img/picture/themeicon.png");
Image image = imageIcon.getImage();
setIconImage(image);// 设置窗体图标
setResizable(false);// 窗体不能改变大小
setTitle("画图(水印内容:[\" + shuiyin + \"])");// 设置标题,添加水印内容提示
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(500, 100, 574, 460);
}
/**
* 启动程序
*/
public static void main(String[] args) {
DrawPictureFrame frame = new DrawPictureFrame();
frame.setVisible(true);
}
}
三、创建画板
import java.awt.*;
/**
* @author WayLon
* @create 2021-07-28 14:39
* 备注:创建面板
*/
public class DrawPictureCanvas extends Canvas {
private Image image = null;
/**
* 设置画板中的图片
*
* @param image - 画板中展示的图片对象
*/
public void setImage(Image image) {
this.image = image;
}
/**
* 重写paint()方法,在画布上绘制图像
*
* @param g
*/
public void paint(Graphics g) {
g.drawImage(image, 0, 0, null);
}
/**
* 重写update()方法,这样可以解决屏幕闪烁的问题。
*
* @param g
*/
public void update(Graphics g) {
paint(g);
}
}
并在DrawPictureFrame类中原有代码上新增一下代码:
第5-10、22、25-34行代码为新增代码
/**
* 画图主窗体。
*/
public class DrawPictureFrame extends JFrame {// 继承窗体类
BufferedImage image = new BufferedImage(570, 390, BufferedImage.TYPE_INT_BGR);// 创建一个8位BGR颜色分量的图像
Graphics gs = image.getGraphics();// 获得图像的绘图对象
Graphics2D g = (Graphics2D) gs;// 将绘图图像转换为Graphics2D类型
DrawPictureCanvas canvas = new DrawPictureCanvas();//创建画布对象
Color forecolor = Color.BLACK;// 定义前景色,在这里可以把前景色理解为画笔颜色
Color bacgroundColor = Color.WHITE;// 定义背景色
/**
* 构造方法。
*/
public DrawPictureFrame() {
ImageIcon imageIcon = new ImageIcon("src/img/picture/themeicon.png");
Image image = imageIcon.getImage();
setIconImage(image);// 设置窗体图标
setResizable(false);// 窗体不能改变大小
setTitle("画图(水印内容:[\" + shuiyin + \"])");// 设置标题,添加水印内容提示
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(500, 100, 574, 460);
init();// 组件初始化
}
/**
* 组件初始化
*/
private void init() {
g.setColor(bacgroundColor);
g.fillRect(0, 0, 570, 390);// 用背景色填充整个画布
g.setColor(forecolor);
canvas.setImage(image);
getContentPane().add(canvas);// 将画布添加到窗体容器默认布局的中部位置
}
/**
* 启动程序
*/
public static void main(String[] args) {
DrawPictureFrame frame = new DrawPictureFrame();
frame.setVisible(true);
}
}
四、添加鼠标画笔功能
下面的代码就是在DrawPictureFrame类已有代码的基础上,添加了鼠标监听功能,以便在拖动鼠标时,能够在窗体上绘制线条。
/**
* 画图主窗体。
*/
public class DrawPictureFrame extends JFrame {// 继承窗体类
/*此处省略相同代码*/
int x = -1, y = -1;// 上一次鼠标绘制点的横、纵坐标
boolean rubber = false;// 橡皮标识变量
boolean drawShape = false;// 画图形标识变量
/**
* 构造方法。
*/
public DrawPictureFrame() {
/*此处省略相同代码*/
init();// 组件初始化
addListener();// 添加组件监听
}
/**
* 为组件添加动作监听
*/
private void addListener() {
// 画板添加鼠标移动事件监听
canvas.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseDragged(final MouseEvent e) {// 当鼠标拖拽时
if (x > 0 && y > 0) {// 如果X和Y存在·鼠标记录
if (rubber) {// 如果橡皮标识为true,表示使用橡皮
g.setColor(bacgroundColor);
g.fillRect(x, y, 10, 10);// 在鼠标滑过的位置画填充的正方形
} else {// 如果橡皮标识为false,表示用画笔画图
g.drawLine(x, y, e.getX(), e.getY());// 在鼠标滑过的位置画直线
}
}
x = e.getX();
y = e.getY();
canvas.repaint();// 更新画布
}
canvas.addMouseListener(new MouseAdapter() {
// 当按键松开时
@Override
public void mouseReleased (MouseEvent e){
// 将记录上一次鼠标绘制点的横纵坐标恢复成-1
x = -1;
y = -1;
}
}
}
/**
* 组件初始化
*/
private void init() {
/*此处省略相同代码*/
}
/**
* 启动程序
*/
public static void main(String[] args) {
/*此处省略相同代码*/
}
}
补充完这些代码之后,再运行main方法,就可以使用鼠标在空白区域画画了。
五、添加工具栏
1.添加工具栏组件
下面的代码就是在DrawPictureFrame类已有代码的基础上,添加以下代码:
/**
* 画图主窗体。
*/
public class DrawPictureFrame extends JFrame {// 继承窗体类
/*此处省略未发生变化的代码*/
boolean drawShape = false;// 画图形标识变量
private JToolBar toolBar;// 工具栏
private JButton eraserButton;// 橡皮按钮
private JToggleButton strokeButton1;// 细线按钮
private JToggleButton strokeButton2;// 粗线按钮
private JToggleButton strokeButton3;// 较粗按钮
private JButton backgroundButton;// 背景色按钮
priva