JAVA MouseEvent getButton

0

Witam!
Chcę do swojej mini-gry 2D załączyć taki fragment kodu, który sprawdza jaki przycisk myszki został użyty przy kliknięciu.Jeśli LPM to w kompilatorze wyświetlane jest LPM. Później myślałem nad dodaniem Point do LPM, czyli jeśli gdzieś kliknę to kompilator mi napisze x,y klika.

Zacząłem od metody sprawdzającej BUTTON. Nie ma błędu, a nie chce działać? =.=

public void mouseClicked(MouseEvent e) {
	if (e.getButton() == MouseEvent.BUTTON1) {
		lpm = true;
		System.out.print("LPM");
	}
	if (e.getButton() == MouseEvent.BUTTON2) {
		ppm = true;
		System.out.print("PPM");
	}
	if (e.getButton() == MouseEvent.BUTTON3) {
		spm = true;
		System.out.print("SPM");
	}
}

oczywiście zmienne spm ppm lpm są uwzględnione:
private boolean lpm;
private boolean spm;
private boolean ppm;

Z góry dziękuję za pomoc.

0

MouseListener dodany do odpowiedniego komponentu?
mouseClicked jest wywoływany po Release gdy nie było przesunięcia.

0
class Klasa implements MouseListener{

public void mouseClicked(MouseEvent e) {
        if (e.getButton() == MouseEvent.BUTTON1) {
                lpm = true;
                x = e.getX();
		y = e.getY();

                System.out.println("LPM");
                System.out.println("x= " + x + ", " + "y= " + y );
        }
        if (e.getButton() == MouseEvent.BUTTON2) {
                ppm = true;
                System.out.print("PPM");
        }
        if (e.getButton() == MouseEvent.BUTTON3) {
                spm = true;
                System.out.print("SPM");
        }
  }

}

Jeżeli wszystko inne w kodzie gra to powinno działać :)

0

Udało mi się wrzucić fragment, który mi podałeś, dodałem również pola składowe public int x i y oraz implementacje mouselistener'a. Kompilacja nie wykazuje błędów, ale żeby ten programik zadziałał muszę chyba napisać metodę mouseReleased. Ktoś może mi tylko napisać mały zarys co tam uwzględnić? W dokumentacji nie wiele jest o mouseReleased.

0

mouseRealease działa dokładnie tak samo jak reszta. Po co w dokumentacji mieli więcej o tym pisać? Metoda wykonywana przy puszczeniu przycisku myszy, tyle w dokumentacji wystarczy. Wystarczy że zostawisz tą metodę pustą.

A przypisujesz listenera odpowiedniemu komponentowi?

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1