import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class SmoothMoverTest extends JFrame
{
public static void main(String args[])
{
new SmoothMoverTest();
}
public SmoothMoverTest()
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(0,0,200,400);
getContentPane().setLayout(new GridLayout(3,1));
final SmoothMover sm = new SmoothMover(this);
JButton b0 = new JButton("move0");
b0.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
sm.mouseMove(500,500,600);
}
});
getContentPane().add(b0);
JButton b1 = new JButton("move1");
b1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
sm.mouseMove(800,100,100);
}
});
getContentPane().add(b1);
JButton b2 = new JButton("suicide");
b2.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
int x = getBounds().x + getBounds().width - 12;
int y = getBounds().y + 12;
sm.mouseMove(x,y,600);
sm.getRobot().mousePress(InputEvent.BUTTON1_MASK);
sm.getRobot().mouseRelease(InputEvent.BUTTON1_MASK);
}
});
getContentPane().add(b2);
setVisible(true);
}
}
class SmoothMover implements MouseMotionListener, MouseListener
{
private Robot robot;
private int currentX;
private int currentY;
private JFrame owner;
public SmoothMover(JFrame frame)
{
owner = frame;
owner.getGlassPane().addMouseMotionListener(this);
owner.getGlassPane().addMouseListener(this);
owner.getGlassPane().setVisible(true);
try
{
robot = new Robot();
}
catch (Exception e)
{
System.out.println("Uh-oh...");
e.printStackTrace();
}
}
public Robot getRobot()
{
return robot;
}
public void mouseMove(int destX, int destY, int duration)
{
int dx = destX - currentX;
int dy = destY - currentY;
int x = currentX;
int y = currentY;
int steps = 100;
int sleepTime = duration / steps;
for (int i=0; i<=steps; i++)
{
float a = (float)i/steps;
x = currentX + (int)(a * dx);
y = currentY + (int)(a * dy);
robot.mouseMove(x,y);
robot.delay(sleepTime);
}
currentX = x;
currentY = y;
}
public void mouseMoved(MouseEvent e)
{
Point p = new Point(e.getPoint());
SwingUtilities.convertPointToScreen(p, owner.getGlassPane());
this.currentX = p.x;
this.currentY = p.y;
redispatchMouseEvent(e);
}
public void mouseDragged(MouseEvent e)
{
Point p = new Point(e.getPoint());
SwingUtilities.convertPointToScreen(p, owner.getGlassPane());
this.currentX = p.x;
this.currentY = p.y;
redispatchMouseEvent(e);
}
public void mouseEntered(MouseEvent e)
{
redispatchMouseEvent(e);
}
public void mouseExited(MouseEvent e)
{
redispatchMouseEvent(e);
}
public void mousePressed(MouseEvent e)
{
redispatchMouseEvent(e);
}
public void mouseReleased(MouseEvent e)
{
redispatchMouseEvent(e);
}
public void mouseClicked(MouseEvent e)
{
redispatchMouseEvent(e);
}
private void redispatchMouseEvent(MouseEvent e)
{
Point glassPanePoint = e.getPoint();
Container container = owner.getContentPane();
Component glassPane = owner.getGlassPane();
Point containerPoint = SwingUtilities.convertPoint(glassPane, glassPanePoint, container);
if (containerPoint.y >= 0)
{
Component component =
SwingUtilities.getDeepestComponentAt(
container,
containerPoint.x,
containerPoint.y);
if (component != null) {
Point componentPoint = SwingUtilities.convertPoint(
glassPane,
glassPanePoint,
component);
component.dispatchEvent(new MouseEvent(component,
e.getID(),
e.getWhen(),
e.getModifiers(),
componentPoint.x,
componentPoint.y,
e.getClickCount(),
e.isPopupTrigger()));
}
}
}
}