如题,先给出代码:
//DrawPanel.java 画板类,完成画图和鼠标的响应
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;abstract class MyShape
{
abstract public void draw(Graphics g,int x,int y,int width,int height);
}
class MyRectangle extends MyShape
{
  public void draw(Graphics g,int x,int y,int width,int height)
{
g.drawRect(x,y,width,height);
}
}class MyCircle extends MyShape
{
public void draw(Graphics g,int x,int y,int width,int height)
{
g.drawOval(x,y,width,height);
}
}class DrawPanel extends JPanel
{  int x1,y1,x2,y2;
  MyShape ms=null;
  ArrayList vt=new ArrayList();//存坐标
  ArrayList vt2=new ArrayList();//形状
    
  DrawPanel()
{
this.addMouseListener(new ml());   //鼠标按下//鼠标弹起
  this.addMouseMotionListener(new nl()); //鼠标拖动事件
} public void setshape(MyShape ms)
{
  this.ms=ms;
}


public void cls()
{
   vt.clear();
 vt2.clear();
 x1=y1=x2=y2=0;
 currentShape=0;
 repaint();
}

//重写绘图方法
public void paint(Graphics g)
{
g.clearRect(0,0,this.getWidth(),this.getHeight());

    for (int i = 0; i<vt.size(); i++)
{
  Rectangle re=(Rectangle)vt.get(i);
  
  int a=(re.x<re.width)?re.x:re.width;
  int b=(re.y<re.height)?re.y:re.height;
  ((MyShape)vt2.get(i)).draw(g,a,b,Math.abs(re.width-re.x),Math.abs(re.height-re.y));
    }
    
    
  int x=(x1<x2)?x1:x2;
    int y=(y1<y2)?y1:y2;
    
    //画出当前选中图形
    ms.draw(g,x,y,Math.abs(x2-x1),Math.abs(y2-y1));//---------------------------Here
    
    
 }
      
//鼠标事件
class ml extends MouseAdapter
{  //鼠标按下
public void mousePressed(MouseEvent e)
{
  x1=e.getX();
  y1=e.getY();
  }

  public void mouseReleased(MouseEvent e)
  {    //鼠标弹起
     Rectangle rea=new Rectangle(x1,y1,x2,y2);
  vt.add(rea);
  vt2.add(ms);
  }
}
//鼠标拖动事件
class nl extends MouseMotionAdapter
{
public void mouseDragged(MouseEvent e)
{
   x2=e.getX();
   y2=e.getY();
   repaint();
}
}
}
///////////////////////////////////////////////////////////////////////////////////
//MainFrame.java 主框架类
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
class MainFrame extends JFrame
{
 
DrawPanel drawPanel = new DrawPanel();
JButton bt_cls = new JButton("清空");
JButton btnRect,btnCircle;

MainFrame()
{
this.setSize(600,500);
this.setTitle("JAVA制作的画图板");
//=============================西部面板
JPanel pw=new JPanel();
pw.setPreferredSize(new Dimension(120,500));
JPanel pw_1=new JPanel();
pw.add(pw_1);
pw_1.setLayout(new GridLayout(5,2));

//按下矩形按钮时
btnRect =new JButton(new ImageIcon("0.png"));
pw_1.add(btnRect);
btnRect.addActionListener(new m());
//按下圆形按钮时
btnCircle =new JButton(new ImageIcon("1.png"));
pw_1.add(btnCircle);
btnRect.addActionListener(new m());
//按下清除按钮时
pw_1.add(bt_cls);
bt_cls.addActionListener(new m()); this.add(pw,BorderLayout.WEST);
this.add(drawPanel);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
} class m implements ActionListener
{
public void actionPerformed(ActionEvent e)
{   
    if(e.getSource()==bt_cls)
    {
     drawPanel.cls();  
    }
    
    
    if(e.getSource()==btnRect)
    {
     drawPanel.setshape(new MyRectangle());
    }
    
    if(e.getSource()==btnCircle)
    {
     drawPanel.setshape(new MyCircle());
    }
    
}

  } public static void main(String arg[]){
new MainFrame();
}
}
这就是全部的代码,想利用多态机制完成画图,编译通过了,可就运行就是不行,问题出现在上面标志为Here处,
报告说是Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at DrawPanel.paint(DrawPanel.java:134)后面就是一堆错误报告,我昨天想了一天了,也没发现问题出现在那里??
痛苦啊~~难道我用多态用错了~~~希望各位高手,给小弟我想想办法啊~~~
谢谢先~~~~