MouseMotionListenerをコンポーネントにアタッチすることでこれを行うことは可能ですが、希望どおりに機能させるには少し手間がかかります。
私はこのようなものから始めます:
private static final double RADIUS = 15.0;
private static final double DIAMETER = 2.0 * RADIUS;
private static final Color XOR_COLOR = Color.yellow;
private static Shape m_circle = null;
@Override
public void mouseMoved(MouseEvent e)
{
Graphics2D g2 = (Graphics2D) getGraphics();
Point p = e.getPoint();
Shape circle = new Ellipse2D.Double(p.getX() - RADIUS, p.getY() - RADIUS, DIAMETER, DIAMETER);
clearCircle(g2);
g2.setXORMode(XOR_COLOR);
g2.draw(circle);
g2.setPaintMode();
m_circle = circle;
}
private void clearCircle(Graphics2D g2)
{
if (m_circle != null)
{
g2.setXORMode(XOR_COLOR);
g2.draw(m_circle);
g2.setPaintMode();
m_circle = null;
}
}
また、MouseListenerを追加してリッスンできるmouseExitedイベントで古いサークルがクリアされていることを確認する必要があります。これには、ユーザーのマウスクリックで非表示/再表示にするために必要なmousePressed / mouseReleased/mouseClickedイベントもあります。
XORを使用すると、同じ形状を同じ色とスタイルで塗り直すことで画面を復元するのが非常に簡単であるため便利ですが、それはあなたが求めていたものではありません。円を描き込もうとしている領域の画像をキャプチャすることで、画面を修復することができます。円を新しい位置にペイントする前に、損傷した領域を再ペイントすることで、画面から円を削除できます。