Đăng Nguyễn
Đăng Nguyễn

Reputation: 122

Draw Lines with mouseevent in java

I have a problem with my project, my project is draw lines (likes paint in windows). I want to draw more one line with mouseDragged,mousePressed and mouseReleased. But when I run to test, it showed a lot of errors, here my code

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++;

    }

}

}

and here's my void main

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);
}
}

Upvotes: 1

Views: 2801

Answers (2)

Gabriel Pereira
Gabriel Pereira

Reputation: 11

You may try this:

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

and the main method:

    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

Upvotes: 0

tobias_k
tobias_k

Reputation: 82949

In your paintComponentmethod, change the line

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

to this:

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

This will get rid of the NullPointerException and the lines will be drawn correctly once you release the mouse button. (Before, you were not only trying to paint the same line in each iteration of the loop, but also a line that did not exist yet, thus the NullPointerException.)

There's another problem: In your releaseMouse and mouseDragged methods, you are setting the end points for the line at index pointCount, but you are drawing only up to pointCount - 1. You have to increment the pointCount counter when you start drawing the lines, otherwise the new line will only be drawn when the mouse is released. One way to fix this would be to change your mouse listener to this:

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
    }
}

Upvotes: 1

Related Questions