制作的第一个画板

制作的第一个画图板
学习到的技巧:
一、队列:
//创建形状队列,用来保存绘制过的形状
ArrayQueue<Shape> shapes = new ArrayQueue<Shape>();
泛型队列是一个泛指的队列。和Object有相似的功能,但它们也有区别,应该说是各有各的好处。
二、数组:
Object 类是一个通类,可以对数组进行任意形式的转换。
// 创建一个数组
Object[] start = new Object[0];
// 创建一个新的数组
public void add(E e) {
// 创建end数组
Object[] end = new Object[start.length + 1];
// 将start中的值赋给end——对数组的长度进行变换。
for (int i = 0; i < start.length; i++) {
end[i] = start[i];
}
// 将stu赋给end的最后一个值
end[start.length] = e;
// 交换数组
start = end;
}
三、重写——重写方法,子类定义了与父类中同名的方法,要考虑权限,即被子类重写的方法不能拥有比父类方法更加严格的访问权限,但可以扩大权限。Private<不写<protected<public
——重写属性,若子类和父类中声明了相同名称的属性,则在子类中直接访问时一定采用“就近访问原则”,即先找到本类中的属性,若要调用父类的属性,则使用“super.属性”格式即可。

class MyPanel extends javax.swing.JPanel{
//重写父类中绘制组建的方法
public void paint(java.awt.Graphics huabu){
//调用父类的方法绘制组件
super.paint(huabu);
if(dlis !=null&&dlis.img!=null){
huabu.drawImage(dlis.img,0,0,dlis.img.getWidth(),dlis.img.getHeight(),null);
四、Final——可声明类、属性、方法。它声明的类不能有子类;声明的方法不能被子类重写;声明的变量为常量,不可修改。
final JPanel leftPanel=new JPanel();
五、Super关键字——可以从子类中调用父类中的构造方法、一般方法、属性,且语句必须放在子类构造方法的首行。要在子类方法中访问父类的方法可直接通过super.方法()。
//调用父类的方法绘制组件
super.paint(huabu);
六、重载:
//重载构造方法直接给属性赋值
public Arc(int x1,int y1,int x2,int y2,Color color1,int size){
this.x1=x1;
this.y1=y1;
this.x2=x2;
this.y2=y2;
this.color1=color1;
this.size=size;
七、继承、重绘:
//重绘(重绘就是重新调用这个绘制方法,画布在哪里就在哪里进行调用)
class MyPanel extends javax.swing.JPanel{
八、抽象类——类似“模板”,专门用来当做父类,目的是要设计者根据它的格式来修改并创建新的类,但不由抽象类创建对象,只能通过抽象类派生出新的类,再由它来创建对象,一个子类只能继承一个抽象类。且子类必须重写抽象类中的所有抽象方法。
1、 包含一个抽象方法的类必须是抽象类。
2、 抽象类和抽象方法都要使用abstract关键字声明。
3、 抽象方法只需声明不需要实现。
4、 抽象方法必须被子类继承,子类(若不是抽象类)必须重写抽象类中的全部抽象方法。
//使用抽象方法来实现各个具体的形状的绘制,才能在另各个形状方法(分别另外创建的方法)中重写方法。
//若直接用方法则各个形状方法不能重写。不是,没有方法体是直类似接口的写法,没有代码的方法也是有方法体的。
//可以举个例子:
//设有方法体:public abstract void noMethodBody();
//空方法体:public void empertyBody(){}
//是有本质的区别的。没有方法体的方法,是需要你去实现的。空方法体,是需要覆盖的。
//没有方法体的方法就是说 给你一个方法,不写方法体,你可以任意扩充它的功能
public abstract class shape {
protected int x1, y1, x2, y2;
protected java.awt.Color color1;
protected int size;
//此 Graphics2D 类扩展 Graphics 类,以提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。
public abstract void draw(java.awt.Graphics2D g);
public void setColor() {
String str1="blue";
java.awt.Color color1=java.awt.Color.getColor(str1);
}
public void drawString(String str, int x1, int y1) {
}
}
九、接口——由全局常量和公共抽象方法组成。
接口若要使用则必须通过子类,子类通过implement实现接口,一个接口不能继承抽象类但一个接口可以继承多个接口。
十、对于绘制的形状有三种保存方式
1、 用泛型队列进行保存
//创建形状队列用来保存绘制过的形状
AnyQueue<shape>
shapes=new AnyQueue<shape>();
2、 用数组进行保存
// 创建二维数组来保存图像上的所有点的颜色
area = new int[img.getHeight()][img.getWidth()];
// 得到图像上每个点的颜色,用数组存储
for (int i = 0; i < area.length; i++) {
for (int j = 0; j < area[i].length; j++) {
area[i][j] = img.getRGB(j, i);
3、 用数组进行保存的简便方法
//创建一个矩形区域,区域大小刚好是drawPanel的区域
java.awt.Rectangle rect=new java.awt.Rectangle(leftPoint,dlim);
//从屏幕上截取一张图像
img=robot.createScreenCapture(rect);
十一、在界面上面对左边、底部工具栏的设置布局,创建中间画板
// 创建左边工具栏,设置内部组件方向为垂直方向
javax.swing.JToolBar left = new javax.swing.JToolBar(
javax.swing.JToolBar.VERTICAL);
创建底部工具栏,设置
// 创建底部工具栏,并且内部组件方向为默认的方向
javax.swing.JToolBar foot = new javax.swing.JToolBar();
创建中间画板
// 创建中间的面板
javax.swing.JPanel center = new javax.swing.JPanel();
// 加在中间面板上的所以为center.
center.setLayout(f2);
// 创建一个画板对象
javax.swing.JPanel drawPanel = new MyPanel();
遇到的主要问题:
1、 不能对颜色进行选定——没有在颜色的分组对象上加上去,创建的按钮模型对象anniu1是空的.
2、 图标加不上去——图标存储的位置不对,应该是在工程下创建一个文件夹,将图标放在此images文件夹中。
3、 按下图标绘制的形状不对——对图标的顺序传的不对,应该按照图标对应的次序加上去。
4、 橡皮擦的颜色不对——在实现橡皮擦时可以将它与铅笔刷子类同,只是橡皮擦的颜色是白色。用到了抽象类,重新写了一个Line1类用于实现橡皮擦的功能。
5、if(type.equals("2")){
x2=e.getX();
y2=e.getY();
Line1 sh=new Line1(x1,y1,x2,y2,color,size);
sh.draw(huabu);
shape.add(sh);
x1=x2;
y1=y2;
Line1 sh=new Line1(x1,y1,x2,y2,color,size);相当于进行了封装,即绘制(实现)图形的方法外部不可见。
心得体会:
对于所要做的要有一个思路,需要什么才去创建什么,需要什么才去加什么,按照思路编写代码。格式是固定的,而思路是不同的。对于要画的形状要创建鼠标监听器,左部、底部工具栏相当于骨架,而工具栏上的组件相当于各个器官,中间的面板相当于肉体。
颜色选择的思路:
直接在DrawUI中设置一个公共类(左键还是右键),用于DrawListener和新创建的用于监听颜色的监听器中,在DrawListener中进行条件的设置,在颜色监听器中进行监听——监听颜色是否传到了huabu上,而DrawUI通过那个公共类就是进行不同颜色的绘制。
不足:
在制作的过程中我发现我对于基本的格式、方法掌握的不好。有思路知道怎么做但就是不知道格式是什么该怎么写。所以以后得加强这方面的记忆。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值