Kod który podał bodzio877 jest wystarczający. Jednak zdarzenie obsługiwane przez mouseClicked jest złożeniem dwóch zdarzeń pierwszego mousePressed oraz następnie mouseReleased - tak jak Ci napisał Razi91.
Do gier z interfejsu MouseListener używa się wyłącznie metod mousePressed i mouseReleased. Obie metody używa się tak samo. Różnicą jest tylko stan klawiszy myszy. Pozostałe metody tego interfejsu mają sens tylko w środowisku GUI.
W ogólnym przypadku powinieneś używać bardziej zbiorczego interfejsu MouseInputListener lub klasy MouseInputAdapter i implementować wyłącznie metody mousePressed, mouseReleased, mouseMoved i mouseWheelMoved. Wszystkie inne zdarzenia myszy bazują na czterech podstawowych zdarzeniach związanych z tymi metodami i zostały wymyślone dla uproszczenia obsługi GUI.
Poniżej przykład jak to wykorzystywać. Obiekt takiej klasy trzeba oczywiście stworzyć i zarejestrować przez wszystkie metody addMouseListener, addMouseMotionListener i addMouseWheelListener.
Cały stan myszy będzie w każdej chwili odpowiadał polom tego obiektu. Oczywiście polom tym można dodać accessory, ale najczęściej nie jest to potrzebne bo klasa tego typu jest zwykle klasą wewnętrzną.
@SuppressWarnings("UseOfSystemOutOrSystemErr")
class MouseEventSupport extends MouseInputAdapter
{
private enum ButtonState { PRESSED, RELEASED; };
private enum EventType { BUTTON, AXIS, WHEEL }
@Override public void mousePressed(final MouseEvent e)
{
setButton(e.getButton(), ButtonState.PRESSED);
showStateChanged(EventType.BUTTON);
}
@Override public void mouseReleased(final MouseEvent e)
{
setButton(e.getButton(), ButtonState.RELEASED);
showStateChanged(EventType.BUTTON);
}
@Override public void mouseMoved(final MouseEvent e)
{
x = e.getX();
y = e.getY();
showStateChanged(EventType.AXIS);
}
@Override public void mouseWheelMoved(final MouseWheelEvent e)
{
wheelRotation = e.getWheelRotation();
showStateChanged(EventType.WHEEL);
}
private void setButton(final int button, final ButtonState newState)
{
switch(button)
{
case MouseEvent.BUTTON1: lpm = newState; break;
case MouseEvent.BUTTON2: ppm = newState; break;
case MouseEvent.BUTTON3: spm = newState; break;
default: System.out.printf("%s custom button: %d", newState, button);
}
}
private void showStateChanged(final EventType type)
{
switch(type)
{
case BUTTON: System.out.printf("LPM = %s%nSPM = %s%nPPM = %s%n",
lpm, spm, ppm);
break;
case AXIS: System.out.printf("(x,y) = (%d, %d)%n", x, y);
break;
case WHEEL: System.out.printf("WHEEL = %+d%n", wheelRotation);
break;
}
}
private volatile ButtonState lpm, ppm, spm;
private volatile int x, y;
private volatile int wheelRotation;
} //class MouseEventSupport extends MouseInputAdapter