[size=large]要制作一个画板可以分为制作画板界面、制作绘制形状的方法(以绘制直线为例)、制作鼠标监听器、制作保存绘制形状的队列、重绘五个部分,下面会依次做解释。[/size]
[size=large]一、制作画板界面[/size]
[color=red]既然是一个画板,那么最基础的就是得有一个画板界面,而一个画板界面则须包括界面的大小、标题、绘制形状功能的按钮(以画直线为例)[/color]
[size=large]二、制作绘制形状的方法[/size]
所有的形状子类都是继承了父类MyShape
[size=large]三、制作保存绘制形状的队列[/size]
[color=red]要制作这个队列,就需要一个队列接口,然后再去重写接口里的方法[/color]
[size=large]四、制作鼠标监听器[/size]
[color=red]鼠标监听器是这个画板能否实现其功能的关键,而在鼠标监听器中包括绘制形状并将绘制的形状保存进队列(以绘制直线的方法为例)[/color]
[color=red]到之前已经能够绘制形状了,但是一旦最小化或最大化后,绘制的形状就会消失,这是为什么呢?因为这些形状只是存储在缓存区,一旦最小化或最大化后缓存区的数据就是被释放,那绘制的形状也就随之消失了,而怎样才能让它不消失呢?那就得将刚绘制的形状再绘制一遍,即重绘。[/color]
[size=large]一、制作画板界面[/size]
[color=red]既然是一个画板,那么最基础的就是得有一个画板界面,而一个画板界面则须包括界面的大小、标题、绘制形状功能的按钮(以画直线为例)[/color]
/**
* 画板的界面类,继承JFrame类
*
*
*/
public class MyDrawUI extends javax.swing.JFrame {
//程序入口
public static void main(String [] asd){
//创建一个窗体对象
MyDrawUI MDU = new MyDrawUI();
//调用显示画板窗体的方法
MDU.initUI();
}
/**
* 定义初始化画板窗体的方法
*/
public void initUI(){
//设置画板窗体的标题
this.setTitle("全能画板");
//设置画板窗体的大小
this.setSize(600,600);
//设置画板窗体隐藏时关闭程序
this.setDefaultCloseOperation(3);
//创建一个布局对象
java.awt.FlowLayout jl = new java.awt.FlowLayout();
//设置窗体为流式布局
this.setLayout(jl);
//创建直线按钮和圆和矩形按钮
javax.swing.JButton line = new javax.swing.JButton("line");
//将按钮添加到窗体上
this.add(line);
//设置画板窗体可见
this.setVisible(true);
//调用获取画布对象的方法
java.awt.Graphics g2 = this.getGraphics();
}
这样一个简单的画板界面就制作好了
[size=large]二、制作绘制形状的方法[/size]
所有的形状子类都是继承了父类MyShape
/**
* 形状父类,用于被其他子类继承
*
*
*/
public abstract class MyShape {
/**
* 定义形状的颜色属性
*/
private java.awt.Color color;
/**
* 定义画形状的方法
* @param g:画布对象
*/
public abstract void Draw(java.awt.Graphics g);
/**
* 定义设置颜色的方法
* @param color:得到的颜色对象
*/
public void setcolor(java.awt.Color color){
this.color = color;
}
/**
* 定义得到颜色的方法
* @return:返回颜色值
*/
public java.awt.Color getcolor(){
return color;
}
}
/**
* 定义一个直线子类,继承父类MyShape
*
*
*/
public class MyLine extends MyShape {
private int x1,y1,x2,y2;
/**
* 定义画直线的方法
* @param x1
* @param y1
* @param x2
* @param y2
*/
public MyLine(int x1,int y1,int x2,int y2){
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}
/**
* 重写父类中画形状的方法
*/
@Override
public void Draw(java.awt.Graphics g) {
/**
* 得到颜色
*/
java.awt.Color color = this.getcolor();
/**
* 设置颜色
*/
g.setColor(color);
g.drawLine(x1, y1, x2, y2);
}
}
这样一个绘制直线的方法就写好了。
[size=large]三、制作保存绘制形状的队列[/size]
[color=red]要制作这个队列,就需要一个队列接口,然后再去重写接口里的方法[/color]
/**
* 定义一个队列接口
*
*
*/
public interface MyQueue1Interface<E> {
/**
* 将元素放入队列中的方法
* @param s:要放入的元素
*/
public void add(E e);
/**
* 将指定下标位置上的元素取出的方法
* @param index:要取出元素的下标位置
* @return:取出的元素
*/
public E get(int index);
/**
* 获取队列的大小
* @return:队列的大小
*/
public int size();
/**
* 将指定元素放入指定下标位置上的方法
* @param s:要放入的元素
* @param index:要放入的下标位置
*/
public void insert(E e,int index);
/**
* 将指定下标位置上的元素移除的方法
* @param index:要移除元素的下标位置
*/
public void remove(int index);
/**
* 将指定位置上的元素修改为指定的元素
* @param index:要修改的元素的位置
* @param s:修改后的元素
*/
public void modify(int index,E e);
}
/**
* 重写接口里的方法
*
*@param <E>:队列中元素的类型
*
*/
public class MyQueue1Imp<E> implements MyQueue1Interface<E>{
//定义一个长度为0的初始数组
Object[] zxc = new Object[0];
public void add(E e) {
//定义一个新的数组,长度为原来数组的长度加一
Object[] asd = new Object[zxc.length+1];
//将新的元素放入到新数组的最后一个下标位置上
asd[zxc.length] = e;
//将原来数组中的数据拷贝到新数组中
for(int i=0;i<zxc.length;i++){
asd[i] = zxc[i];
}
zxc = asd;
}
public E get(int index) {
E e = (E)zxc[index];
return e;
}
public int size() {
return zxc.length;
}
public void insert(E e, int index) {
//定义一个新的数组
Object[] sdf = new Object[zxc.length+1];
//将新元素放入新数组中指定的位置
sdf[index] = e;
//将原来的数据拷贝到新的数组
for(int i=0;i<index;i++){
sdf[i] = zxc[i];
}
for(int j=index;j<zxc.length;j++){
sdf[j+1] = zxc[j];
}
zxc = sdf;
}
public void remove(int index) {
for(int i=index;i<zxc.length-1;i++){
zxc[i] = zxc[i+1];
}
}
public void modify(int index, E e) {
zxc[index] = e;
}
}
这样一个能存储绘制形状的队列就写好了。
[size=large]四、制作鼠标监听器[/size]
[color=red]鼠标监听器是这个画板能否实现其功能的关键,而在鼠标监听器中包括绘制形状并将绘制的形状保存进队列(以绘制直线的方法为例)[/color]
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
public class MyDrawListener implements java.awt.event.MouseListener,java.awt.event.ActionListener {
//定义属性
private int x1,y1,x2,y2;
private java.awt.Graphics g1;
private String shape="line";
private String color = "white";
private MyQueue1Imp<MyShape> shapeArray;
//创建一个画布
public MyDrawListener(java.awt.Graphics g1,MyQueue1Imp<MyShape> shapeArray){
this.shapeArray = shapeArray;
this.g1 = g1;
}
//**********************重写Actionlistener的方法****************************\\
public void actionPerformed(ActionEvent e){
shape = e.getActionCommand();
}
//**********************重写Mouselistener的方法****************************\\
//重写鼠标按下时的方法
public void mousePressed(MouseEvent e){
//获取鼠标按下时的坐标
x1 = e.getX();
y1 = e.getY();
}
//重写鼠标释放时的方法
public void mouseReleased(MouseEvent e){
//获取鼠标释放时的坐标
x2 = e.getX();
y2 = e.getY();
MyShape Msh = null;
//调用画直线的方法
if("line".equals(shape)){
Msh = new MyLine(x1,y1,x2,y2);
Msh.Draw(g1);
shapeArray.add(Msh);
}
//重写鼠标单击时的方法
public void mouseClicked(MouseEvent e){
}
//重写鼠标进入时的方法
public void mouseEntered(MouseEvent e){
}
//重写鼠标退出时的方法
public void mouseExited(MouseEvent e){
}
}
[color=red]制作好鼠标监听器后就得将鼠标监听器添加到画板的绘制形状按钮上[/color]
在获取画板之后添加一下代码:
//给鼠标监听器创建一个对象
MyDrawListener MDL = new MyDrawListener(g2,shapeArray);
//添加鼠标监听器到窗体
this.addMouseListener(MDL);
//添加按钮监听器
line.addActionListener(MDL);
[size=large]五、重绘[/size]
[color=red]到之前已经能够绘制形状了,但是一旦最小化或最大化后,绘制的形状就会消失,这是为什么呢?因为这些形状只是存储在缓存区,一旦最小化或最大化后缓存区的数据就是被释放,那绘制的形状也就随之消失了,而怎样才能让它不消失呢?那就得将刚绘制的形状再绘制一遍,即重绘。[/color]
/**
* 重写绘画的方法
*/
public void paint(java.awt.Graphics g){
//调用父类中的方法来绘制窗体
super.paint(g);
//遍历队列中的形状
for(int i=0;i<shapeArray.size();i++){
//定义一个形状对象
MyShape Msh = shapeArray.get(i);
Msh.Draw(g);
}
}
[size=large]至此整个的一个简单画板就完成了,o(∩_∩)o ~~[/size]