画图板的改进和多态

今天,我学到了画图板的重绘和加强了对多态的理解。

原本的画图板就想上一次博客那样,只是用了鼠标监听器来对画图面板作画。一旦界面出现了变动,作图面板的数据就重置了。这里涉及了硬盘、内存以及缓存的知识,缓存的内容就是储存界面当前的数据,界面出现了变动,缓存的数据就会清空。

于是就需要用到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 ;
		}
	}

今天收获颇多。 大笑

你可能感兴趣的:(画图板的改进和多态)