课程题目描述

利用GUI方法实现一个较为简单的绘图应用程序。用户可以选择要画的图形(如线,椭圆或圆,矩形),选择方式不限,例如单选按钮、下拉框、菜单等方式,可以选择画笔颜色和画笔粗细,用鼠标单击和拖曳等动作绘图,并保存图片。

考虑到画图板的实际需要,画图板要实现保存图片,用于保存当前图片至本地;选择需要绘制的图形,用于选择需要绘制的图形样式,如直线、矩形、椭圆等;设置画笔色以及画笔大小,用于设置画笔颜色和当前画笔粗细;擦除错误操作等。

本软件的重难点为主窗体的设计、菜单栏和工具栏的设计、事件响应的处理、画图的基本功能的实现。

功能的实现

1.如何选择要画的图形。

图形的选择有多种实现方式,如菜单、单选按钮、下拉框等,这里我们选用了单选按钮来实现。

基本图形按钮包括:U-def(随笔画)、Line(直线)、Round(椭圆)、Rect(矩形)、RRect(圆角矩形)、Ereaser(橡皮擦)。

任何一个图形对象使用paint()方法为绘图工具就可以画出线条、矩形、圆形等各种图形来。该方法为:

Public void paint(Graphics g);

绘图工具paint()通过Graphics对象绘制具体的图形。

2.选择画笔的颜色和粗细。

画笔颜色按钮包括:黑 ,深蓝 ,天蓝 ,深灰 ,浅灰

绿 ,粉 ,黄 ,默认颜色为黑色。

使用Graphics类设置颜色,首先要创建颜色类Color的对象,创建颜色对象的构造方法为:

Public Color(int r,int g,int b);

也可以使用Color类的静态常量作为颜色对象的参数,创建颜色对象的构造方法为:

Public Color(Color.颜色静态常量);

画笔粗细按钮包括:1、3、5、7、9、11、13、15、17共九个级别,默认状态为1。

使用BasicStroke来实现控制线条粗细。

例如,先使用Line2D类创建直线对象,再使用BasicStroke类创建一个供画笔paint()方法选择线条粗细的对象。BasicStroke类的一个常用构造方法为:

Public BasicStroke(float width,int cap,int join);

3.鼠标单击和拖拽等动作绘图。

要能够让图形界面接收到用户的操作,就必须给各个组件添加事件处理机制。在Java中,当用户使用鼠标进行操作时,就会产生鼠标事件MouseEvent。对MouseEvent事件的响应是实现MouseListener接口或MouseMotionListener接口,或者是继承MouseAdapter类,来实现鼠标适配器MouseAdapter提供的方法。

界面展示(部分)

1.功能界面


java画图 github java画图软件课程设计_Public

2.颜色选取


java画图 github java画图软件课程设计_2d_02

3.文件保存


java画图 github java画图软件课程设计_Math_03

代码示例(部分)
/*****************************************************************************
**
* 下面是各种基本图形单元的子类,都继承自父类drawings ,请仔细理解继承的概念
******************************************************************************
**/
@SuppressWarnings("serial")
class Line extends drawings
// 直线类
{
void draw(Graphics2D g2d) {
g2d.setPaint(new Color(R, G, B));
g2d.setStroke(new BasicStroke(stroke, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
g2d.drawLine(x1, y1, x2, y2);
}
}
@SuppressWarnings("serial")
class Rect extends drawings
// 矩形类
{
void draw(Graphics2D g2d) {
g2d.setPaint(new Color(R, G, B));
g2d.setStroke(new BasicStroke(stroke));
g2d.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2));
}
}
@SuppressWarnings("serial")
class fillRect extends drawings
// 实心矩形类
{
void draw(Graphics2D g2d) {
g2d.setPaint(new Color(R, G, B));
g2d.setStroke(new BasicStroke(stroke));
g2d.fillRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2));
}
}
@SuppressWarnings("serial")
class Oval extends drawings
// 椭圆类
{
void draw(Graphics2D g2d) {
g2d.setPaint(new Color(R, G, B));
g2d.setStroke(new BasicStroke(stroke));
g2d.drawOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2));
}
}
@SuppressWarnings("serial")
class fillOval extends drawings
// 实心椭圆
{
void draw(Graphics2D g2d) {
g2d.setPaint(new Color(R, G, B));
g2d.setStroke(new BasicStroke(stroke));
g2d.fillOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2));
}
}
@SuppressWarnings("serial")
class Circle extends drawings
// 圆类
{
void draw(Graphics2D g2d) {
g2d.setPaint(new Color(R, G, B));
g2d.setStroke(new BasicStroke(stroke));
g2d.drawOval(Math.min(x1, x2), Math.min(y1, y2), Math.max(Math.abs(x1 - x2), Math.abs(y1 - y2)),
Math.max(Math.abs(x1 - x2), Math.abs(y1 - y2)));
}
}
@SuppressWarnings("serial")
class fillCircle extends drawings
// 实心圆
{
void draw(Graphics2D g2d) {
g2d.setPaint(new Color(R, G, B));
g2d.setStroke(new BasicStroke(stroke));
g2d.fillOval(Math.min(x1, x2), Math.min(y1, y2), Math.max(Math.abs(x1 - x2), Math.abs(y1 - y2)),
Math.max(Math.abs(x1 - x2), Math.abs(y1 - y2)));
}
}
@SuppressWarnings("serial")
class RoundRect extends drawings
// 圆角矩形类
{
void draw(Graphics2D g2d) {
g2d.setPaint(new Color(R, G, B));
g2d.setStroke(new BasicStroke(stroke));
g2d.drawRoundRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2), 50, 35);
}
}
@SuppressWarnings("serial")
class fillRoundRect extends drawings
// 实心圆角矩形类
{
void draw(Graphics2D g2d) {
g2d.setPaint(new Color(R, G, B));
g2d.setStroke(new BasicStroke(stroke));
g2d.fillRoundRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2), 50, 35);
}
}
@SuppressWarnings("serial")
class Pencil extends drawings
// 随笔画类
{
void draw(Graphics2D g2d) {
g2d.setPaint(new Color(R, G, B));
g2d.setStroke(new BasicStroke(stroke, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
g2d.drawLine(x1, y1, x2, y2);
}
}
@SuppressWarnings("serial")
class Rubber extends drawings
// 橡皮擦类
{
void draw(Graphics2D g2d) {
g2d.setPaint(new Color(255, 255, 255));
g2d.setStroke(new BasicStroke(stroke + 4, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
g2d.drawLine(x1, y1, x2, y2);
}
}
@SuppressWarnings("serial")
class Word extends drawings
// 输入文字类
{
void draw(Graphics2D g2d) {
g2d.setPaint(
new Color(R, G, B));
g2d.setFont(new Font(s2, x2 + y2, ((int) stroke) * 18));
if (s1 != null)
g2d.drawString(s1, x1, y1);
}
}

项目总结

画图板软件的开发,使我们收获了更多的知识。而这些知识是实践中才能学得到的。这也正验证了一句话:纸上得来终觉浅,绝知此事要躬行。没错,学习不仅仅是大脑的思考,更要有实践的配合。

有需要源码的可以私信或者留言评论,我看到之后就会回复(无偿索要源码者勿扰,毕竟都是一点一点敲出来的)。