下图为一个简易绘图板,他可以选择需要绘制的图形并选取绘制图形的颜色。同时可以在拖动窗体时保持图形不消失。
为了实现绘图板的制作,需要以下准备知识
准备知识
1 类与子类
2 接口
3 类的转换
4 类中方法的重写
1 类与子类
在java中,可以定义父类与子类。子类可以实现对父类的继承。
在写好一个父类之后,可以再写一个类并在类的命名时,在子类名后加上”extends 父类名“以实现对父类的继承。子类继承父类所有的属性和方法。并且子类可以新写父类没有的属性或方法。也可以对父类已有的属性和方法进行重写。
注意,对于类来说,其变量可以时抽象的(未被定义具体数值),但方法一定要是具体的({}中有具体的语句)
2 接口
java中接口和类相互对应。接口的变量要是具体的(有具体数值且加上static final对变量进行修饰),方法是抽象的(只有方法名,{}中没有语句)
在使用接口时,需要新定义一个类并 implements 接口名 以实现对接口的重写,并且一个类可以实现多个接口。并在后续需要时可以对这个类进行传递。(传递的过程现阶段还没见过)
3 类的转换
对于一个对象来说,他所对应的类可能有父类或子类。这种情况下这个对象对应的类可以转化为其父类或子类(主要是为了处理等式两边的类型要对齐的问题)
将子类转化为父类(向上转化)称为自动转型。这是可以随便转的。
UNStudent unStudent = new UNStudent();
Student student = unStudent;
将父类转化为子类(向下转化)称为强制转型。这个转的时候要小心,可能会出问题。(可能多次转换之后出现平级转换的情况,这是不被允许的)
UNStudent unStudent = new UNStudent();
UNStudent unstu1 = (UNStudent) student;
注意,转型看似是定义了一个新的对象然后重新赋值,但实际上只传了地址没有传内容。 也就是说第一个例子中的student和unStudent的地址是完全一样的。如果此时再将student强行转化为high Student就会报错。
之所以向上转型叫自动,向下转型叫强制是因为:向上转型的时候新定义的对象的所有属性和方法都是有的,但向下转型的时候可能会出现有的属性没有定义的情况,相较没那么自然。
4 重写
子类继承父类方法的除操作外的所有性质(方法名,方法类型等),并对操作再写一次。
至此,就可以开始创建一个绘图板了
需要导入的包有
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
我们需要按钮监听器和鼠标监听器(接口)
第一步定义一个UI类
在这个类里面定义一个方法,实现窗口本身的定义(名字,大小,位置,x键的作用,窗口类型)实现按钮的定义(类型和颜色)
第二步定义另一个类实现鼠标监听器和按钮监听器的重写
对于按钮监听器,获取按钮上的文本,如果为空表示为颜色按钮,获取按钮颜色(此时要用到转型的方法),否则为类型按钮,获取其文本。
对于鼠标监听器,依据文本的不同实现图形的绘制。
第三步创建一个新的类以实现储存操作
同时定义一个数组,将每一次的操作都保存到这个数组里。(具体方法为定义一个新类,其中属性为一次点击或操作需要保存的数据,将这个类的对象作为数组来保存数据)
Basic[] basics = new Basic[1000];
注意,绘制图形的时候需要Graphic对象及其相应方法。
第四步在UI类中对按钮和鼠标加上监听。并把UI的画布用等式传给监听器类。
第五步定义一个新类并继承JFrame类
这个类通过重写paint方法以实现对之前保存的数据的再写
注意1,在重写之前(或者重写刚开始时)需要加上
super.paint(graphics);
语句,这样使得重写的paint并不是完全重写,而是在原有的绘制逻辑和行为上进行新增绘行为。没有这个语句会导致一些外观或行为上的问题。
第六步,将UI类中的界面定义语句,由用JFrame定义改为用新写的JFrame子类定义
注意,保存的数据此时保存在listener对象中,需要在UI类中把这个数组由listener对象传到新子类对应的对象中去。