import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;
public class Draw {
public static void main(String args[]){
MyFrame f=new MyFrame("drawing");
}
}
class MyFrame extends Frame{

ArrayList<ArrayList<Point>>alllines=new ArrayList<ArrayList<Point>>();
ArrayList<Point>points=new ArrayList<>(); 
public MyFrame(String tit){
super(tit);
setBounds(300,300,300,300);
setVisible(true);
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.addMouseMotionListener(new MouseMotionAdapter(){
public void mouseDragged(MouseEvent e) {
points.add(new Point(e.getX(),e.getY()));
alllines.add(points);
repaint();
}

}); }
 public void update(Graphics g){
  paint(g);
 }
public void paint(Graphics g){
for(Iterator<ArrayList<Point>>i=alllines.iterator();i.hasNext();){
for(Iterator<Point>j=i.next().iterator();j.hasNext();){
int x1=0,x2=0,y1=0,y2=0;
Point p=(Point)j.next();
x2=(int)p.getX();
y2=(int)p.getY();
if(x1!=0)g.drawLine(x1, y1, x2, y2);
x1=x2;
y1=y2;
repaint();
}
}
}
}
不管我怎么点就是没有任何的线条,这是为什么啊,我是菜鸟,可以的话请详解,谢谢各位了!

解决方案 »

  1.   

    楼主你用的jdk版本是多少啊,ArrayList<Point>points=new ArrayList<>(); 这句可以编过?大致问题如下:
    1、在mouseDragged方法中调用了repaint(),然后回调进入update()方法,
    然后调用paint()方法,然后在其中又调了repaint()方法,然后又转入update()方法,
    然后……看到了,无穷了。
    2、在paint方法中,第二层的for中每次都新定义了x1 = 0;然后在执行
    if (x != 0) g.drawLine(...);这条具体的画线函数之前并没有对x1的值进行更新。
    在下面更新就没用了。修整过的程序,可以画线了,呵呵:import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import java.util.List;
    public class Draw {
    public static void main(String args[]){
    MyFrame f=new MyFrame("drawing");
    }
    }
    class MyFrame extends Frame{
    ArrayList<ArrayList<Point>>alllines=new ArrayList<ArrayList<Point>>();
    ArrayList<Point>points=new ArrayList<Point>();  public MyFrame(String tit){
    super(tit);
    setBounds(300,300,300,300);
    setVisible(true);
    this.addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }
    });
    this.addMouseMotionListener(new MouseMotionAdapter(){
    public void mouseDragged(MouseEvent e) {
    // System.out.println("(" + e.getX() + ", " + e.getY() + ")");
    points.add(new Point(e.getX(),e.getY()));
    alllines.add(points);
    repaint();
    }
    });
    }
    public void update(Graphics g){
    paint(g);
    }
    public void paint(Graphics g){
    for(Iterator<ArrayList<Point>>i=alllines.iterator();i.hasNext();){
    int x1=0,x2=0,y1=0,y2=0;
    for(Iterator<Point>j=i.next().iterator();j.hasNext();){
    Point p=(Point)j.next();
    x2=(int)p.getX();
    y2=(int)p.getY();
    if(x1!=0)g.drawLine(x1, y1, x2, y2);
    x1=x2;
    y1=y2;
    // repaint();
    }
    }
    }
    }
      

  2.   

    我用的jdk7
    顺便问一句,画的线条怎么是一根线啊,怎样修改让鼠标释放后再点击拖动时,重新画出一条线呢?
    菜鸟问题较多,请多包涵啊!
      

  3.   

    这个就是一些小逻辑问题了,参考下吧,可以单独画线了。
    增加了对鼠标按下的事件监听器。
    具体修正部分见程序中的注释:import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import java.util.List;
    public class Draw {
        public static void main(String args[]){
            MyFrame f=new MyFrame("drawing");
        }
    }
    class MyFrame extends Frame{
        ArrayList<ArrayList<Point>>alllines=new ArrayList<ArrayList<Point>>();
        ArrayList<Point>points=new ArrayList<Point>(); 
    // Added below
    private int x1, x2, y1, y2;
    // End    public MyFrame(String tit){
            super(tit);
            setBounds(300,300,300,300);
            setVisible(true);
            this.addWindowListener(new WindowAdapter(){
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
            this.addMouseMotionListener(new MouseMotionAdapter(){
                public void mouseDragged(MouseEvent e) {
                    // System.out.println("(" + e.getX() + ", " + e.getY() + ")");
                    points.add(new Point(e.getX(),e.getY()));
                    alllines.add(points);
                    repaint();
                }
            });
    // Added below
    this.addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent e) {
    x1 = y1 = x2 = y2 = 0;
    points.clear();
    }
    });
    // End
        }
        public void update(Graphics g){
            paint(g);
        }
        public void paint(Graphics g){
            for(Iterator<ArrayList<Point>>i=alllines.iterator();i.hasNext();){
    // Modified below
    x1 = y1 = x2 = y2 = 0;
    // End
                for(Iterator<Point>j=i.next().iterator();j.hasNext();){
                    Point p=(Point)j.next();
                    x2=(int)p.getX();
                    y2=(int)p.getY();
                    if(x1!=0)g.drawLine(x1, y1, x2, y2);
                    x1=x2;
                    y1=y2;
                    // repaint();
                }
            }
        }
    }