在java中使用mouseevent绘制线条

时间:2013-10-06 09:00:24

标签: java swing

我的项目有问题,我的项目是绘制线条(喜欢在windows中绘画)。我想用mouseDragged,mousePressed和mouseReleased绘制更多的一行。但是当我跑去测试时,它显示了很多错误,这里是我的代码

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 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分: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