TestDrag2.java

Download testbed2.zip

Program allows user to select and drag individual objects.

See also

Capacitor.java
GridPanel.java


TestDrag2.java

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

public class TestDrag2 extends GridPanel implements MouseMotionListener
{
    ArrayList<Capacitor> clist = new ArrayList<Capacitor>();
    JLabel status = new JLabel(" ");
    double xoffset, yoffset;
    Capacitor current = null;

    TestDrag2()
    {
        Capacitor c1 = new Capacitor();
        c1.setPosition(0.0,1.0);
        c1.setAngle(30.0);
        c1.color = Color.BLUE;
	c1.name = "C1";
	clist.add(c1);
	Capacitor c2 = new Capacitor();
	c2.name = "C2";
	clist.add(c2);
	
	status.setBackground(Color.WHITE);
	status.setOpaque(true);
	status.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));

     	addMouseMotionListener( this );
        addMouseListener(new MouseHandler());
    }


    public void drawContent(Graphics g)
    {
	for (Capacitor c: clist) c.draw(g);
    }

   private Capacitor find(Point2D src) {
	Point2D dst = new Point2D.Double();
	for (Capacitor c: clist) {
		boolean inside = c.getLocation(src,dst);
		if (inside) return c;
	}
	return null;
    }
	 

   private class MouseHandler extends MouseAdapter
   {
      public void mousePressed(MouseEvent e)
      {
	Point2D src = new Point2D.Double(e.getX(),e.getY());
	Point2D grid = new Point2D.Double();
	tf.transform(src,grid);
	current = find(grid);
	if (current!=null) {
		xoffset = current.xpos - grid.getX();
		yoffset = current.ypos + grid.getY();
	}
      }
}

    public void mouseDragged( MouseEvent e )
   {
	String str;
	Point2D src = new Point2D.Double(e.getX(),e.getY());
	Point2D dst = new Point2D.Double();
	tf.transform(src,dst);
	if (current!=null) {
		current.setPosition(dst.getX()+xoffset,-dst.getY()+yoffset);
		repaint();
		str = String.format("Dragged to [ %.2g, %.2g]",current.xpos,current.ypos);
	}
	else str = " ";
	
      status.setText(str );
   }


   public void mouseMoved( MouseEvent e )
   {
	Point2D src = new Point2D.Double(e.getX(),e.getY());
	Point2D grid = new Point2D.Double();
	tf.transform(src,grid);
	Point2D dst = new Point2D.Double();
	String str = String.format("Moved at [ %.2g, %.2g]",grid.getX(),-grid.getY());
	boolean inside = false;
	Capacitor cap = find(src);
	if (cap!=null) {
		cap.getLocation(grid,dst);
		str = String.format("inside %s: [%.2g %.2g]",cap.name, dst.getX(),-dst.getY());
	}
        status.setText( str );
     }


    public static void main(String[] args)
    {
        EventQueue.invokeLater(() -> {
		TestDrag2 panel = new TestDrag2();
		JFrame application = new JFrame("TestDrag2");
		application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		application.add(panel);
		application.add(panel.status,BorderLayout.SOUTH);
		application.setSize(496,400);
		application.setVisible(true);
	});
    }
}


Maintained by John Loomis, updated Thu Feb 20 15:50:07 2020