growline.java

Download: growline.zip

A "grow line" is a line that is continually redrawn as the mouse is dragged from a fixed pivot point.

References

getGraphics()
setXORMode
drawLine


growline.java

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.awt.geom.*;
import javax.swing.*;


class growline extends JPanel implements MouseMotionListener
{
    ArrayList<Line2D> lines;
    Point base, current;
    boolean isDragging;
    
    growline()
    {
	isDragging = false;
	lines = new ArrayList<Line2D>();
	addMouseListener(new MouseHandler());
	addMouseMotionListener(this);
    }

    public void paintComponent(Graphics g)
    {
	super.paintComponent(g);

	Graphics2D g2 = (Graphics2D) g;
	for (Line2D line: lines) g2.draw(line);
    }

    private class MouseHandler extends MouseAdapter
    {

	public void mousePressed(MouseEvent event)
	{
	    isDragging = true;
	    current = event.getPoint();
	    base = event.getPoint();
	}

	public void mouseReleased(MouseEvent event)
	{
	    isDragging = false;
	    current = event.getPoint();

	    Graphics g = getGraphics();
	    int bx = base.x;
	    int by = base.y;
	    g.setXORMode(Color.WHITE);
	    g.drawLine(bx,by,current.x,current.y);
	    g.setPaintMode();
	    g.setColor(Color.BLACK);
	    lines.add(new Line2D.Double(bx,by,current.x,current.y));
	    repaint();
	}
    }

    public void mouseDragged(MouseEvent event)
    {
	Graphics g = getGraphics();
	int bx = base.x;
	int by = base.y;
	g.setXORMode(Color.WHITE);
	g.drawLine(bx,by,current.x,current.y);
	current = event.getPoint();
	g.drawLine(bx,by,current.x,current.y);
	g.setPaintMode();
	g.setColor(Color.BLACK);
    }

    public void mouseMoved(MouseEvent event)
    {
    }

   public static void main(String[] args)
   {
       EventQueue.invokeLater(new Runnable() {
	   public void run()
	   {
	       growline panel = new growline();
	       JFrame frame = new JFrame("Grow Line");
	       frame.add(panel);
	       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	       frame.setSize(400,400);
	       frame.setVisible(true);
	   }
       });
   }
}


Maintained by John Loomis, updated Tue Feb 26 18:22:45 2019