码农基础篇(一)
——实现简单的画板(JAVA版本)
序言之项目感慨
在过去的四五个星期,我间间断断地实现了一个小小的项目——画图板。现在能实现的功能有画出不同形状的图形,以及改变画笔绘画的颜色,还有一个重绘的功能。在做起这个的项目的那一日起,我才明白,原来一份简单的画板并不是想象中的那么容易的。在后续过程我还将会不断为这个粗糙的项目添加一些功能,以及美化界面。这些都是后续了。现在我来小论一下画板前期做项目的感受及思路吧。
积累知识阶段
经过前几天的学习积累,我知道了一些类似于JFrame,JPanel等容器和JButton,JPasswordFiled之类的组件,还学习了继承父类实现接口这些稍微复杂一点的内容。在实现接口的同时,必然少不了添加监听器的活儿。现在一谈到添加监听器,第一反应是参数传递,遇到参数传递就会想到空指针,当初始化时忘记定义变量,以及数据在中途忘记传递,就会引起空指针现象。我提前在这里说了空指针现象,是因为本人大大咧咧不拘小节常犯这样的错误,还望观者记住尽量避免此类错误的发生。
我在打开系统自带的画板的时候,不禁想到,我,能不能也做一个类似的画板呢?我的画板能够用各种颜色的画笔画出各种不同的形状,在我缩小放大画图板的时候图形能不能还是还是我缩小之前的样子呢?
项目始于一些小小的构想,而我现在对项目的这个构想应该是后续在实现功能的时候一点一点的挤牙膏似得挤出来的。记得上一学期C++老师有提前向我们展示大三大四可能会接触的课程——项目设计,那时候我才明白原来工程项目并不是简简单单几行代码就能搞定的事情。
画图板代码阶段
上面那么多废话以后,我现在在真正的说说我的代码思路了吧。
首先创建一个JFrame,分居南北两面的JPanel,和无数的JButton按钮,将JPanel添加到JFrame上面,JButton添加到南面的JPanel上面(以及大多数人的习惯添加到南面的,这个格局也是按照大多数的人习惯而设置的)。
public class DrawUI extends JFrame{
public void initUI(){
this.setTitle("画板"); // 给窗体命名
this.setSize(new Dimension(700,600)); // 给窗体设置大小
this.setLocationRelativeTo(null);// 将窗体的位置设在屏幕的中心位置
this.setDefaultCloseOperation(3); // 设置窗体关闭
...
JButton jb_Line = new JButton(line);
jb_Line.setActionCommand("line");
JPanel jp_north = new JPanel();
jp_north.setPreferredSize(new Dimension(690,50));//设置面板的大小
jp_north.setBackground(Color.gray);
...
this.add(jp_north,BorderLayout.NORTH);//设置面板在窗体的北边(边框布局)
this.add(jp_south,BorderLayout.SOUTH);
jp_north.add(jb_Line);
...
this.setVisible(true); // 使窗体可见
}
}
其次为不同的行为添加监听器。以画出不同形状的JButton为例:采用的是点击鼠标以及拖拉鼠标这些行为可以重写MouseMotionListener接口,并将相应事件行为添加到这个重写的接口下面。
// 创建形状按钮监听器对象
ShapeListener sl = new ShapeListener();
// 给形状按钮添加监听器
jb_Line.addActionListener(sl);
public class DrawListener implements MouseListener{
...
/**
* 重载构造函数(旨在传递参数),将参数赋值给各个属性
* @param g
* @param sl
* @param cl
*/
public DrawListener(Graphics g, ShapeListener sl,
ColorListener cl){
this.g = g;
this.sl = sl;
this.cl = cl;
}
...
}
最后,重绘功能的实现。将需要保存的数据封装在Shape类中,并将类存放在动态数组中。重写JPanel类,重绘缩小或是改变窗口行为之前的图形。
public class MyShape {
// 定义Shape类的属性(起始点坐标,图形类型,画笔颜色)
private int x1,x2,y1,y2;
private String type;
private Color color;
...
}
public class MyJPanel extends JPanel{
/**
* 重写重绘方法
*/
public void paint(Graphics g)
{
super.paint(g); //重绘窗体
System.out.println("chonghui");
for (int i = 0; i < DrawListener.my_q.getSize(); i++){
DrawListener.my_q.seekIndex(i).drawShape(g);
}
}
}