今天,我学到了画图板的重绘和加强了对多态的理解。
原本的画图板就想上一次博客那样,只是用了鼠标监听器来对画图面板作画。一旦界面出现了变动,作图面板的数据就重置了。这里涉及了硬盘、内存以及缓存的知识,缓存的内容就是储存界面当前的数据,界面出现了变动,缓存的数据就会清空。
于是就需要用到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); } }
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 ; } }