import java.awt.*;
import java.util.*;
import java.awt.event.*;
public class MyMouseAdapter {
Frame f = new Frame("drawing...");
ArrayList points = null;
//private MyCanvas drawArea = new MyCanvas();
public void paint(Graphics g)
{
Iterator i = points.iterator();
while(i.hasNext())
       {
Point p = (Point)i.next();
g.setColor(Color.BLUE);
g.fillOval(p.x, p.y, 10, 10);
}
}
public void addPoint(Point p)
{
points.add(p);
}
public void init()
{
f.addMouseListener(new MouseAdapter()
{
public void mouseReleased(MouseEvent e)
{
addPoint(new Point(e.getX(),e.getY()));
f.repaint();
//drawArea.repaint();
}
});
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//drawArea.setPreferredSize(new Dimension(250,180));
//f.add(drawArea);
f.pack();
f.setVisible(true);
}
/*class MyCanvas extends Canvas
{
public void paint(Graphics g)
{
Iterator i = points.iterator();
while(i.hasNext())
{
Point p = (Point)i.next();
g.setColor(Color.BLUE);
g.fillOval(p.x, p.y, 10, 10);
}
}
}*/
public static void main(String[] args)
{
new MyMouseAdapter().init();
}
}
我想让鼠标在窗口中点下就有个小圆出现,可每次一点就出错了,请问应该怎么改呢?

解决方案 »

  1.   

    异常是因为
    ArrayList points = null;
    没赋值points 为空
      

  2.   

    ArrayList points = null;
    没有初始化
    ArrayList points = new ArrayList();
      

  3.   

    改成这样,paint方法才会被调用import java.awt.*;
    import java.util.*;
    import java.awt.event.*;public class MyMouseAdapter {
        ArrayList points = null;
        Frame f = new Frame("drawing...") {
            public void paint(Graphics g) {
                Iterator i = points.iterator();
                System.out.println("" + i.hasNext());
                while (i.hasNext()) {
                    Point p = (Point) i.next();
                    System.out.println("x" + p.x + ", y" + p.y);
                    g.setColor(Color.BLUE);
                    g.fillOval(p.x, p.y, 10, 10);
                }
            }
        };    public void addPoint(Point p) {
            points.add(p);
        }    public void init() {
            points = new ArrayList();
            f.addMouseListener(new MouseAdapter() {            public void mouseReleased(MouseEvent e) {
                    addPoint(new Point(e.getX(), e.getY()));
                    f.repaint();
                }
            });
            f.addWindowListener(new WindowAdapter() {            public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
            f.setBounds(100, 100, 200, 200);
            f.setVisible(true);
        }    public static void main(String[] args) {
            new MyMouseAdapter().init();
        }
    }
      

  4.   

    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    public class MyMouseAdapter{
      public static void main(String args[]) {
        new MyFrame("drawing...");
      }
    }class MyFrame extends Frame {
      ArrayList points = null;
      MyFrame(String s) {
        super(s);
        points = new ArrayList(); 
        setLayout(null);
        setBounds(300,300,400,300); 
        this.setBackground(new Color(204,204,255));
        setVisible(true);
        this.addMouseListener(new Monitor());
    }

    public void paint(Graphics g) {
        Iterator i = points.iterator();
        while(i.hasNext()){
          Point p = (Point)i.next();
          g.setColor(Color.BLUE);
          g.fillOval(p.x,p.y,10,10);
        }
      }
      
      public void addPoint(Point p){
        points.add(p);
      }
    }class Monitor extends MouseAdapter {
      public void mousePressed(MouseEvent e) {
        MyFrame f = (MyFrame)e.getSource();
        f.addPoint(new Point(e.getX(),e.getY()));
        f.repaint();
      }
    }
      

  5.   

    为什么要把paint方法放到里面才可以呢,如果我改成下面的,点怎么也显示不出来呢,是paint方法也没调用吗?
    import java.awt.*;
    import java.util.*;
    import java.awt.event.*;
    public class MyMouseAdapter {
    ArrayList points = null;
    private MyCanvas drawArea = new MyCanvas();
    Frame f = new Frame("drawing...");
    /*{
    //private MyCanvas drawArea = new MyCanvas();
    public void paint(Graphics g)
    {
    Iterator i = points.iterator();
    System.out.println("" + i.hasNext());
    while(i.hasNext())
           {
    Point p = (Point)i.next();
    g.setColor(Color.BLUE);
    g.fillOval(p.x, p.y, 10, 10);
    }
    }
    };*/
    public void addPoint(Point p)
    {
    points.add(p);
    }
    public void init()
    {
    points = new ArrayList();
    f.addMouseListener(new MouseAdapter()
    {
    public void mouseReleased(MouseEvent e)
    {
    addPoint(new Point(e.getX(),e.getY()));
    f.repaint();
    drawArea.repaint();
    }
    });
    f.addWindowListener(new WindowAdapter()
    {
    public void windowClosing(WindowEvent e)
    {
    System.exit(0);
    }
    });
    drawArea.setPreferredSize(new Dimension(250,180));
    f.add(drawArea);
    f.setBounds(100, 100, 200, 200);
        f.setVisible(true);
    f.pack();
    f.setVisible(true); }
    class MyCanvas extends Canvas
    {
    public void paint(Graphics g)
    {
    Iterator i = points.iterator();
    while(i.hasNext())
    {
    Point p = (Point)i.next();
    g.setColor(Color.BLUE);
    g.fillOval(p.x, p.y, 10, 10);
    }
    }
    }
    public static void main(String[] args)
    {
    new MyMouseAdapter().init();
    }
    }
      

  6.   

    是呀,写里面是重写了Frame的paint,当调用Frame.repaint方法时会先清除,再调用Frame.paint方法
    重画,写外面它就不属于Frame,Frame调用不就没画出点来