今天,我学到了画图板的重绘和加强了对多态的理解。
原本的画图板就想上一次博客那样,只是用了鼠标监听器来对画图面板作画。一旦界面出现了变动,作图面板的数据就重置了。这里涉及了硬盘、内存以及缓存的知识,缓存的内容就是储存界面当前的数据,界面出现了变动,缓存的数据就会清空。
于是就需要用到ArrayList来当做容量存储画出来的每一个图像,每一个图像都要当做一个对象处理,放置在ArrayList里面。ArrayList 可以看做一个动态数组,不限制存储数量。每一次界面出现变动就重绘一次,把ArrayList里面的数据取出来画上面板。这就是画图板重绘的思想。
ArrayList是泛型。因此定义一种类型,就是定义一个Shape类,Shape类是Line类、Rect类以及Oval类的父类,这样ArrayList就可以成为这三个类的对象的容器了。
Shape是一个抽象类,他的三个子类重写里面的draw方法,按下不同的按钮就调用不同的类的对象,画出的图像就不同,这就是多态。
if("line".equals(s)){
Shape line = new Line(x1,x2,y1,y2,draw.color);
line.draw(g);
draw.list.add(line);
}
else if("rect".equals(s)){
Shape rect = new Rect(x1,x2,y1,y2,draw.color);
rect.draw(g);
draw.list.add(rect);
}
else if("oval".equals(s)){
Shape oval = new Oval(x1,x2,y1,y2,draw.color);
oval.draw(g);
draw.list.add(oval);
}
}
这是Line类,Oval和Rect类差不多。
package draw;
import java.awt.Color;
import java.awt.Graphics;
public class Line extends Shape{
public int x1,x2,y1,y2 ;
public Color color ;
public Line(int x1,int x2,int y1,int y2,Color color){
this.x1 = x1;
this.x2 = x2;
this.y1 = y1;
this.y2 = y2;
this.color = color;
}
public void draw(Graphics g) {
g.setColor(color);
g.drawLine(x1, y1, x2, y2);
}
}
Shape类
package draw;
import java.awt.Color;
import java.awt.Graphics;
public abstract class Shape {
public int x1,x2,y1,y2 ;
public Color color ;
public void shape (int x1,int x2,int y1,int y2,Color color){
this.x1 = x1;
this.x2 = x2;
this.y1 = y1;
this.y2 = y2;
this.color = color;
}
public abstract void draw(Graphics g);
}
我还为颜色按钮添加了事件监听器
ActionListener coloraction = new ActionListener(){
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
JButton jbutton = (JButton) obj;
color = jbutton.getBackground();
}
};
for(int i = 0; i<7; i++){
JButton J2 = new JButton();
panelcolor.add(J2);
J2.setBackground(colors[i]);
J2.setPreferredSize(new Dimension(30,30));
J2.addActionListener(coloraction);
}
,和实现了铅笔功能.
public void mouseDragged(MouseEvent e) {
if("pencil".equals(s)){
x2 = e.getX();
y2 = e.getY();
Shape line = new Line(x1,x2,y1,y2,draw.color);
line.draw(g);
draw.list.add(line);
x1 = x2 ;
y1 = y2 ;
}
}
今天收获颇多。