JAVA MouseEvent getButton

Odpowiedz Nowy wątek
2011-09-03 14:07
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.

edytowany 1x, ostatnio: Skatty, 2011-09-03 14:08

Pozostało 580 znaków

2011-09-03 16:41
0

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

Pozostało 580 znaków

2011-09-04 09:44
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ć :)

edytowany 1x, ostatnio: bodzio877, 2011-09-04 09:46

Pozostało 580 znaków

2011-09-04 10:32
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.

Pozostało 580 znaków

2011-09-04 13:44
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?

Pozostało 580 znaków

2011-09-04 14:06
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

Jeżeli ktoś komuś coś, ewentualnie nikt nikomu nic, to właściwie po co...?
edytowany 2x, ostatnio: Olamagato, 2011-09-04 14:20

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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