画图板的基本结构为北部的菜单栏,中部的画布,南部的颜色选择栏,和西部的工具栏所组成,要实现画图板的功能首先需要有一块画布.
可以这样实现,首先实例化一个面板对象,然后用getGraphics()方法获取面板的画布,之后再把面板对象添加到窗体的中部就可以了
当然弄好画布之后还需要对画布的四周进行一定的修饰。如在北部需要有菜单项,所以需要用到JMenuBar,JMenu,JMenuItem这三个类
,而西部与南部,则需要用到JToolBar类,目的是可以将西部或南部面板拉到窗体之外。这样画图板的基本结构就做好了。接下来进入最重要也是最复杂的
部分,给工具栏与颜色栏以及画布添加监听器来实现画图的功能,具体怎么实现呢?
第一,给工具栏添加监听器,我们的目的是当你点击你所需要的图标时,在画布上画的时候就能实现特定的功能,因为我们在工具栏里放入的是图片,而图片都是有名字的,我们可以采用
图片特定的名字来作为我们所区分的依据,例如:代表直线的图片为line.jpg,就可以通过判断是不是这个名字来获取你点击的是直线。
代码如下:
//定义一个匿名内部类
private ActionListener al=new ActionListener(){
public void actionPerformed(ActionEvent e) {
type=(String)e.getActionCommand();//返回一个事件类型的对象
System.out.println("type="+type);
}
};
通过调用匿名内部类来得到图片的type,之后再写type的get方法就可以了
西部搞定之后,就只剩下颜色栏了,首先因为每一个颜色选择都是一个按钮,所以当我们点击颜色框的时候只要获取按钮的颜色就行了
color=btn.getBackground();//获取按钮的颜色,之后因为会用到颜色,所以也需要写一下颜色的get方法。但是程序远远没有这样简单,我们发现
画板是区分前景色和背景色的,而且当你点击鼠标左键时为前景色,鼠标右键时为背景色。我们需要用到鼠标监听器里面的e.getbutton()方法,这样得到的
值为int型,只有3个值,1代表当前点击了左键,2代表鼠标滚轮操作,3代表点击了右键。这样我们就可以实现了
代码:
//使用匿名内部类的方式来实现事件处理类,设置左键为前景色,右键为背景色
private MouseAdapter al=new MouseAdapter(){
//得到按的是左键还是右键
public void mouseClicked(MouseEvent e) {
JButton btn=(JButton)e.getSource();//返回一个事件类型的对象
color=btn.getBackground();//获取按钮的颜色
System.out.println("输出颜色"+color);
int count=e.getButton();//得到计数器,1为左键,2滚轮,3右键
//判断
if(count==1){
//如果为左键,设置前景色
buttonfront.setBackground(color);
colorfront=color;//前景色为color的颜色
}
else if(count==3){
//如果是右键,设置背景色
buttonback.setBackground(color);
colorback=color;//背景色为color的颜色
}
}
};
这样当我们写好colorfront,colorback的get方法后就可以了
接下来就是画图的方法:因为要画各种各样的图形,我们发现每个图形都会有坐标,以及画的方法,我们可以先写一个shape类,定义坐标属性以及抽象画图形方法
package Tool;
//图形抽象类
import java.awt.Color;
import java.awt.Graphics;
/**
* 图形抽象类
*
* @author Administrator
*
*/
public abstract class Shape {
private int x1, y1, x2, y2;
public byte type;//用于判断
private Color color;
/**
* 构造方法
*
* @param x1起始X
* @param y1起始Y
* @param x2结束X
* @param y2结束Y
* @param color图形颜色
*/
public Shape(int x1, int y1, int x2, int y2, Color color) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
this.color = color;
}
public int getX1() {
return x1;
}
public int getY1() {
return y1;
}
public int getX2() {
return x2;
}
public int getY2() {
return y2;
}
public Color getColor() {
return color;
}
public abstract void draw(Graphics g);
//得到队列对象
}
之后你需要画直线就可以写一个shapeline的类通过继承
shape的属性以及重写其draw方法就可以了
具体如何就不作赘述
现在还有最关键的一步就是写监听器类了
首先我们要用到工具栏里图片中的type
以及颜色栏中的color
所以我们需要在监听器里创建工具栏以及颜色栏的属性
通过构造方法传参来创建新对象,再调用对象的gettype方法和getcolor方法
就可以了
核心代码:
public DrawingListener(Graphics g, ColorPanel cp, ToolPanel tp) {
this.g = g;
this.cp = cp;
this.tp = tp;
}
z最后通过重写鼠标监听器里的方法就能实现画图板的基本功能了。
/**
* 鼠标在事件源上按下的时候调用的方法
*/
public void mousePressed(MouseEvent e) {
if (!tp.getType().equals("Polygon") || i == 1) {
x1 = e.getX();
y1 = e.getY();
}
}
/**
* 鼠标在事件源上释放的时候调用的方法
*/
public void mouseReleased(MouseEvent e) {
x2 = e.getX();
y2 = e.getY();
if (tp.getType().equals("Line")) {
// 实例化shape的对象
shape = new ShapeLine(x1, y1, x2, y2, cp.getcolor());
shape.type=1;//规定type为1时画直线
System.out.println(shape + " " + g);
shape.draw(g);
//将shape储存到队列中
list.add(shape);
System.out.println("++++++"+list);
System.out.println("在画直线");
}
if (tp.getType().equals("Rect")) {
// 实例化shape的对象
shape = new ShapeRect(x1, y1, x2, y2, cp.getcolor());
shape.type=2;//规定type为2时画矩形
System.out.println(shape + " " + g);
shape.draw(g);
//将shape储存在队列中
list.add(shape);
System.out.println("在画矩形");
}
if (tp.getType().equals("Round")) {
// 实例化shape的对象
shape = new ShapeRound(x1, y1, x2, y2, cp.getcolor());
shape.type=3;//规定type为3时为画圆
System.out.println(shape + " " + g);
shape.draw(g);
//将shape储存在队列中
list.add(shape);
System.out.println("在画圆");
}
if (tp.getType().equals("RoundRect")) {
// 实例化shape的对象
shape = new ShapeRoundRect(x1, y1, x2, y2, cp.getcolor());
shape.type=4;//规定type为4时为画圆脚矩形
shape.draw(g);
//将shape储存在队列中
list.add(shape);
}
//多边形
if (tp.getType().equals("Polygon")) {
if (i == 1) {
x0 = x1;
y0 = y1;
i++;
}
// 实例化shape的对象
shape = new ShapePolygon(x1, y1, x2, y2, cp.getcolor());
if (Math.abs(x0 - x2) < 5 && Math.abs(y0 - y2) < 5) {
// 实例化shape的对象
shape = new ShapePolygon(x0, y0, x1, y1, cp.getcolor());
i = 1;
}
shape.draw(g);
x1 = x2;
y1 = y2;
}
}
/**
* 鼠标在事件源上按下并拖动时执行的方法
*/
public void mouseDragged(MouseEvent e) {
if (tp.getType().equals("Atomizer") || tp.getType().equals("Eraser")
|| tp.getType().equals("Pencil")
|| tp.getType().equals("Brush")) {
x2 = e.getX();
y2 = e.getY();
// 判断点击的是否是喷枪
if (tp.getType().equals("Atomizer")) {
// 实例化Shape的对象
shape = new ShapeAtomizer(x1, y1, x2, y2, cp.getcolor());
shape.type=6;//规定为6时为喷枪
shape.draw(g);
list.add(shape);
}
if (tp.getType().equals("Eraser")) {
// 实例化shape的对象
shape = new ShapeEraser(x1, y1, x2, y2, cp.getcolor());
shape.type=7;//规定为7时为橡皮
x1 = x2;
y1 = y2;
shape.draw(g);
list.add(shape);//将shape对象添加到队列中
}
if (tp.getType().equals("Pencil")) {
// 实例化shape的对象
shape = new ShapePencil(x1, y1, x2, y2, cp.getcolor());
shape.type=8;//规定为8时为铅笔
x1 = x2;
y1 = y2;
shape.draw(g);
list.add(shape);
}
if (tp.getType().equals("Brush")) {
// 实例化shape的对象
shape = new ShapeBrush(x1, y1, x2, y2, cp.getcolor());
shape.type=9;
x1 = x2;
y1 = y2;
shape.draw(g);
list.add(shape);
}
//System.out.println("shape"+shape);
//System.out.println("g"+g);
//shape.draw(g);
}
}
分享到:
相关推荐
总结,Windows画图板以其简单易用和功能丰富的特点,成为了日常生活中进行动态画图的得力助手。无论是儿童学习绘画,还是成年人进行快速草图设计,它都能提供一个便捷的平台。通过对画图板的深入理解和熟练运用,...
总结来说,QT画图板是一个很好的学习案例,涵盖了Qt GUI编程中的许多核心概念和技术,包括图形渲染、事件处理、用户交互和数据持久化等。通过学习和实践这个项目,你可以提升对Qt框架的理解,为开发更复杂的应用程序...
在Java学习过程中,创建一个简单的画图板是一个经典的练习项目,它可以帮助我们深入理解图形用户界面(GUI)的构建和事件处理机制。本篇小结将聚焦于如何使用Java实现一个基本的画图板,同时提供相关的源码分析。 1...
在本文档中,我们将探讨如何使用QtCreator来编写一个画图板程序。画图板是一个基础且功能丰富的应用,常常作为学习图形用户界面(GUI)编程的一个入门项目。本文将重点介绍Qt的GUI框架、主要组件以及编程概念。 ###...
总结起来,"canvas 画图板.zip" 提供了一个基于 HTML5 Canvas 的简易在线画图工具实现。通过解析 HTML、CSS 和 JavaScript 文件,我们可以了解如何利用 Canvas API 创建交互式的画图板,包括监听鼠标事件、绘制线条...
总结,实现一个画图板涉及多个Java Swing组件和事件处理机制的理解。通过这个过程,开发者可以深入学习GUI编程,以及图形绘制和交互设计的基本原理。对于初学者,这是一个很好的练习项目,能帮助他们更好地掌握Java...
总结,这个“virtual c++6.0 mfc简易画图板”项目充分展示了MFC在图形界面编程中的应用,通过MFC的类和方法,实现了类似Windows画图板的基本功能。通过学习和实践此类项目,开发者可以深入理解MFC的工作原理,提高...
总结来说,这个"画图板代码"项目涵盖了事件处理、图形绘制、图形状态管理和用户交互设计等多个核心编程概念,是学习和实践GUI编程的一个良好起点。通过深入研究和实践,开发者可以进一步提升在图形用户界面开发领域...
总结来说,这个"用VC编的画图板程序"是一个利用MFC和可能的GDI/GDI+技术实现的图形应用程序,它的开发涉及到C++编程、GUI设计、事件处理、图形绘制等多个方面。对于想要深入理解VC开发和图形编程的用户,这是一个很...
总结起来,一个强大的画图板不仅是一个简单的绘图工具,更是创意表达、协同工作和知识传递的重要平台。它在技术博客中扮演着不可或缺的角色,帮助作者以更直观的方式传达复杂的技术概念。无论你是设计师、教师、学生...
总结,"类似于画图板的小程序"是一个综合性的C#项目,涵盖了图形用户界面设计、事件处理、图形绘制、文件操作等多个知识点,对于学习C#编程和理解Windows应用程序开发流程具有很大的实践价值。通过分析和实践这个...
总结起来,创建一个C#画图板涉及到Windows Forms应用程序的基础知识,图形绘制API的使用,以及鼠标事件的处理。这个项目不仅有助于理解C#编程,还能加深对图形用户界面设计的理解。通过不断迭代和添加更多功能,如...
在Java编程语言中,画图板(Canvas)是图形用户界面(GUI)开发的一个关键组件。它是Java AWT(Abstract Window Toolkit)库的一部分,用于在窗口上绘制图形。Canvas类继承自Component,允许程序员直接在屏幕上进行...
总结来说,这个【Java画图板系统】项目展示了如何使用Java GUI技术来创建一个交互式的绘图应用。通过Eclipse IDE,开发者可以方便地管理、编译和调试代码,确保在不同JDK版本下的一致性。对于学习和理解Java GUI编程...
总结来说,这个C#的简单画图板源码涉及了C#的基础语法、Windows Forms开发、图形绘制、事件处理、颜色选择等核心概念。对于初学者来说,这是一个很好的实践项目,能帮助他们深入理解和掌握这些关键知识点。通过分析...
总结来说,"画图板C++写的代码" 是一个很好的学习资源,它展示了如何使用C++和Windows API或MFC来创建一个功能丰富的图形应用程序。这个项目涵盖了图形绘制、用户交互、文件操作等多个关键领域,对于想要深入学习C++...
### VC++画图板设计与实现 #### 一、项目背景及目标 本课程设计的主要目的是让学生通过实际操作,深入理解和掌握使用Visual C++ (VC++) 开发环境进行软件开发的基本方法和技术。通过本项目的实践,学生将能够熟悉...
总结来说,《Java画图板》是一款集实用性和教学性于一体的软件,它结合了Java编程的理论与实践,为用户提供了一个简洁易用的图形绘制平台,同时也为学习Java语言的学生提供了一个良好的实践平台。通过设计和实现这样...