2013-10-06 127 views
1

我的项目出现问题,我的项目是绘制线条(喜欢在Windows中绘制)。我想用mouseDragged,mousePressed和mouseReleased绘制更多的一行。但是,当我运行测试,它表现出了很多的错误,在这里我的代码在java中使用mouseevent绘制线条

package image; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Point; 
import java.awt.Graphics; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class paint extends JFrame{ 
private Point points[] = new Point[10000]; 
private Point pointends[] = new Point[10000]; 
private int pointCount = 0; 
public paint() 
{ 
    panel paint2 = new panel(); 
    add(paint2,BorderLayout.CENTER); 
} 
private class panel extends JPanel 
{ 

    public panel() 
    { 
     setBackground(Color.BLUE); 
     MouseHandler handler = new MouseHandler(); 
     this.addMouseMotionListener(handler); 

     this.addMouseListener(handler); 
    } 
    @Override 
    protected void paintComponent(Graphics g) 
    { 
     // TODO Auto-generated method stub 
     super.paintComponent(g); 
     for(int i = 0;i < pointCount;i++) 
     { 
      g.setColor(Color.RED); 
      g.drawLine(points[pointCount].x, points[pointCount].y, pointends[pointCount].x, pointends[pointCount].y); 
     }   
    } 
} 

private class MouseHandler extends MouseAdapter 
{ 
    @Override 
    public void mouseDragged(MouseEvent e) 
    { 
     // TODO Auto-generated method stub 
      pointends[ pointCount ] = e.getPoint(); 
      repaint(); 


    } 
    @Override 
    public void mousePressed(MouseEvent e) { 
     // TODO Auto-generated method stub 
     super.mousePressed(e); 
     if(pointCount < points.length) 
     { 
      points[ pointCount ] = e.getPoint(); 
     } 
    } 
    @Override 
    public void mouseReleased(MouseEvent e) { 
     // TODO Auto-generated method stub 
     super.mouseReleased(e); 
     pointends[pointCount]=e.getPoint(); 
     repaint(); 
     pointCount++; 

    } 

} 

}

,这里是我的无效的主要

package image; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import java.awt.BorderLayout; 
import java.awt.BorderLayout; 

public class test 
{ 

public static void main(String[] args) { 

paint paint1 = new paint(); 
/*paintP.add(paint1, BorderLayout.CENTER); 
paintP.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
paintP.setSize(400,400); 
paintP.setVisible(true);*/ 
paint1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
paint1.setSize(400,400); 
paint1.setVisible(true); 
} 
} 
+2

**很多的错误**?编译时间?运行 ?请告诉我们错误! –

+1

[Java编码标准§9](http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-135099.html#367)建议类名称应以大写字母开头。 –

回答

1

在你paintComponent方法,改线

g.drawLine(points[pointCount].x, points[pointCount].y, pointends[pointCount].x, pointends[pointCount].y); 

对此:

g.drawLine(points[i].x, points[i].y, pointends[i].x, pointends[i].y); 

这将摆脱NullPointerException,一旦松开鼠标按钮,线条就会被正确绘制。 (之前,你不只是想画在同一行中循环的每次迭代,也认为还不存在一条线,从而NullPointerException异常。)

还有另外一个问题:在你releaseMousemouseDragged方法,您正在为索引pointCount设置该行的结束点,但您只能绘制到pointCount - 1。开始绘制线条时,必须增加pointCount计数器,否则仅在释放鼠标时绘制新线。解决这一问题将是一个办法,你的鼠标监听改成这样:

private class MouseHandler extends MouseAdapter { 
    public void mouseDragged(MouseEvent e) { 
     pointends[ pointCount - 1 ] = e.getPoint(); // note the "- 1" 
     repaint(); 
    } 
    public void mousePressed(MouseEvent e) { 
     if(pointCount < points.length) { 
      points[ pointCount ] = e.getPoint(); 
      pointends[ pointCount ] = e.getPoint(); // add end point 
      pointCount++; 
      repaint(); 
     } 
    } 
    public void mouseReleased(MouseEvent e) { // do nothing 
    } 
} 
+0

噢谢谢@@,但是当我拖着鼠标,它不画线,当我释放鼠标时画了一条线 –

+0

非常感谢你:) –

0

你可以试试这个:

public class myDrawLine extends JPanel { 

private static final long serialVersionUID = 1L; 

// These ArrayList will save all Points of Pressed and Released 
ArrayList<Point> pointStart = new ArrayList<Point>(); 
ArrayList<Point> pointEnd = new ArrayList<Point>(); 

// These single Points will save the point of Dragged 
Point startSinglePoint = new Point(); 
Point endSinglePoint = new Point(); 

public void paint(Graphics g) { 

    super.paint(g); 

    g.drawLine(startSinglePoint.x, startSinglePoint.y, endSinglePoint.x, 
      endSinglePoint.y); 

    for (int i = 0; i < pointStart.size() && i < pointEnd.size(); i++) { 
     g.drawLine(pointStart.get(i).x, pointStart.get(i).y, 
       pointEnd.get(i).x, pointEnd.get(i).y); 
    }// end for 
}// end paint 

{// start Block of Listeners 
    addMouseListener(new MouseAdapter() { 

     public void mousePressed(MouseEvent e) { 
      startSinglePoint = e.getPoint(); // used to the draw line when 
               // you drag 
      pointStart.add(e.getPoint()); // used to save all drew lines 
     }// end mousePressed 

     public void mouseReleased(MouseEvent e) { 
      pointEnd.add(e.getPoint()); // used to save all drew lines 
      repaint(); 
     }// end mouseReleased 
    });// end addMouseListener 

    addMouseMotionListener(new MouseAdapter() { 

     public void mouseDragged(MouseEvent e) { 
      endSinglePoint = e.getPoint(); // used to draw the line when you 
              // drag 
      repaint(); 
     }// end mouseDragged 
    });// end addMouseMotionListener 

}// end Block of Listeners 
}// end Class 

和主要方法:

public static void main(String[] args){ 
    JFrame frame = new JFrame("Draw Line"); 
    frame.setSize(300, 300); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 

    myDrawLine draw = new myDrawLine(); 
    frame.getContentPane().add(draw); 

}//end main