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