Download testbed2.zip
Program allows user to select and drag individual objects.
See also
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