Thanks Markus_Persson. Now I do this, I have some things to improve to follow your advice:
public synchronized void mouseMoved(final MouseEvent e) {
final int dx = e.getX() - _component.getWidth() / 2;
final int dy = e.getY() - _component.getHeight() / 2;
if (dx != 0 || dy != 0) {
_clickArmed.clear();
_clicks.clear();
final MouseEvent me = new MouseEvent((Component) e.getSource(), e.getID(), e.getWhen(), e.getModifiers(), e
.getX(), e.getY(), e.getXOnScreen(), e.getYOnScreen(), e.getClickCount(), e.isPopupTrigger(), e
.getButton());
initState(me);
addNewState(me, _lastState.getButtonStates(), null);
if (robot == null) {
try {
robot = new Robot();
} catch (final AWTException ex) {
ex.printStackTrace();
}
}
final Point componentCenter = new Point(_component.getWidth() / 2, _component.getHeight() / 2);
SwingUtilities.convertPointToScreen(componentCenter, _component);
robot.mouseMove(componentCenter.x, componentCenter.y);
}
}
private void initState(final MouseEvent mouseEvent) {
if (_lastState == null) {
final int height = (_frame != null && _frame.getComponentCount() > 0) ? _frame.getComponent(0).getHeight()
: _component.getHeight();
_lastState = new MouseState(mouseEvent.getX(), height - mouseEvent.getY(), 0, 0, 0, null, null);
}
}
private void addNewState(final MouseEvent mouseEvent, final EnumMap<MouseButton, ButtonState> enumMap,
final Multiset<MouseButton> clicks) {
// changing the y value, since for AWT, y = 0 at the top of the screen
final int height = (_frame != null && _frame.getComponentCount() > 0) ? _frame.getComponent(0).getHeight()
: _component.getHeight();
final int fixedY = height - mouseEvent.getY();
final MouseState newState = new MouseState(mouseEvent.getX(), fixedY, mouseEvent.getX() - _lastState.getX(),
fixedY - _lastState.getY(), (mouseEvent instanceof MouseWheelEvent ? ((MouseWheelEvent) mouseEvent)
.getWheelRotation() : 0), enumMap, clicks);
_upcomingEvents.add(newState);
_lastState = newState;
}