package com.drawmyline;import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class DrawMyLine extends Frame { /**
 * @param args
 */
Image outImage = null;//定义内存中的 Image对象.
Graphics ig =null; 
private int X1;
private int Y1;
private int X2;
private int Y2;
public static void main(String[] args) {
// TODO Auto-generated method stub
DrawMyLine dyl = new DrawMyLine();
}

public DrawMyLine(){
this.setSize(1000, 1000);
this.setVisible(true); //设置可见性.
Dimension d =getSize();
Image i = createImage(d.width, d.height);
ig =i.getGraphics(); //内存中的 Image.
addWindowListener(new WindowAdapter() { //设置正常关闭.
public void windowClosing(WindowEvent e){
e.getWindow().dispose();
}
});
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e){
X1 = e.getX();
Y1 = e.getY();
}

public void mouseReleased(MouseEvent e){ //鼠标按下时画线.
X2 = e.getX();
Y2 = e.getY();
Graphics g = getGraphics();
g.drawLine(X1, Y1, X2, Y2);
g.drawString(X1+","+Y1, X1, Y1);
g.drawString(X2+","+Y2, X2, Y2);

ig.drawLine(X1, Y1, X2, Y2);
ig.drawString(X1+","+Y1, X1, Y1);
ig.drawString(X2+","+Y2, X2, Y2);

}
});

}

public void paint(Graphics g){ //重写paint()方法.
if (outImage!=null) {
g.drawImage(outImage, 0, 0, this);
}

}}

解决方案 »

  1.   

    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Point;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.util.ArrayList;
    import java.util.List;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;public class DrawMyLine extends JPanel {
      public static void main(String[] args) {
        
        SwingUtilities.invokeLater(new Runnable() {      @Override
          public void run() {
            
            JFrame f = new JFrame("Draw My Line");
            f.setContentPane(new DrawMyLine());
            f.setSize(1000, 1000);
            f.setLocationRelativeTo(null);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setVisible(true);
          }
        });
      }  private Point from;
      private List<Segment> segments;
      
      public DrawMyLine() {
        
        from = new Point(0, 0);
        segments = new ArrayList<Segment>(25);
        
        addMouseListener(new MouseAdapter() {      @Override
          public void mousePressed(MouseEvent e) {
            
            from.x = e.getX();
            from.y = e.getY();
          }      @Override
          public void mouseReleased(MouseEvent e) {
            
            segments.add(new Segment(from, e.getPoint()));
            repaint();
          }
        });
      }  @Override
      public void paintComponent(Graphics g) {
        
        super.paintComponent(g);
        
        g.setColor(Color.BLACK);
        for(Segment s : segments)
          s.draw(g);
      }
      
      private static class Segment {
        
        private final int x1, x2, y1, y2;
        private Segment(Point from, Point to) {
          
          x1 = from.x;
          y1 = from.y;
          x2 = to.x;
          y2 = to.y;
        }
        
        private void draw(Graphics g) {
          
          g.drawLine(x1, y1, x2, y2);
        }
      }
    }
      

  2.   

    我找不到错误在哪?大家帮看看哪里有问题,我不想看个copy的另一个代码哈···谢谢,麻烦了!
      

  3.   

    错误一: AWT早就淘汰了,不要用,用Swing错误二: outImage 从头到尾都是 null,你重写的 paint() 方法不工作错误三: 你在 paint() 方法以外的地方进行了绘制,直接用了Frame的Graphics来绘制,系统重绘Frame的时候,你所有的绘制都丢了错误四: 你在 EDT 以外的线程里初始化GUI控件错误五: 即使你用了正确的线程,正确初始化了 outImage,用它正确记录了你所有的绘制,写对了paint()方法(顺便一说,重写paint()是不合适的,直接重写Frame的paint()是更不合适的,如前所述,应该用Swing,应该定义一个控件如JPanel,然后重写它的paintComponent()方法)…………即使你前面这些都做对了,——那也不对,因为窗口的大小可以被用户的拖拽改变,而你的 outImage 是固定大小
    …………这就是我为什么直接给你贴了正确的代码。