7

Chcę zaimplementować metodę, w której użytkownik musi przytrzymać lewy i prawy przycisk myszy w tym samym czasie.huśtawka java przytrzymaj oba przyciski myszy

Używam Swinga i Javy 1.7. Próbowałem, ale nie wykrywa sprawy, zarówno przyciski jak będę oczekiwać go:

public void mousePressed(MouseEvent e) {  
    if (SwingUtilities.isLeftMouseButton(e) && SwingUtilities.isRightMouseButton(e)){ 
       ///code here 
    } 
} 

próbowałem oddzielić metod i używać wartości bool, aby zdecydować, czy zostanie wciśnięty przycisk myszy i następnie ustawiłem warunek, aby dowiedzieć się, czy oba są wciśnięte w tym samym czasie, ale to też nie działa.

+2

'Próbowałem oddzielić metody i użyć wartości bool, aby zdecydować, czy przycisk myszy jest wciśnięty, a następnie ustawić warunek, aby dowiedzieć się, czy oba z nich są wciśnięte w tym samym czasie, ale to didint wyszło zbyt ..." - Brzmi jak rozsądne podejście. Opublikuj [SSCCE] (http://sscce.org/), która pokazuje, co próbujesz. – camickr

+0

dziękuję bardzo za zainteresowanie ... ale kod postat poniżej działa, był prawie taki sam, ale dekistacja po naciśnięciu myszy była oparta na if (SwingUtilities.isLeftMouseButton (e)) {left = true} i to nie działało ... dziwne: D –

Odpowiedz

6

To jest SSCCE, który robi to, co chcesz ... tzn. czy poprawnie zrozumiałem twoje pytanie .

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class StackOverflow15957076 extends MouseAdapter 
{ 
    private JLabel status; 

    private boolean isLeftPressed; 
    private boolean isRightPressed; 

    public StackOverflow15957076() 
    { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE); 

     JPanel panel = new JPanel (new FlowLayout (FlowLayout.CENTER)); 

     status = new JLabel ("waiting for both mouse buttons..."); 

     status.addMouseListener (this); 

     panel.add (status); 

     frame.add (panel); 

     frame.pack(); 
     frame.setVisible (true); 

     isLeftPressed = false; 
     isRightPressed = false; 
    } 

    @Override 
    public void mousePressed (MouseEvent e) 
    { 
     if (SwingUtilities.isLeftMouseButton (e)) 
     { 
      isLeftPressed = true; 
     } 
     else if (SwingUtilities.isRightMouseButton (e)) 
     { 
      isRightPressed = true; 
     } 

     if (isLeftPressed && isRightPressed) 
     { 
      status.setText ("both buttons are pressed"); 
     } 
    } 

    @Override 
    public void mouseReleased (MouseEvent e) 
    { 
     if (SwingUtilities.isLeftMouseButton (e)) 
     { 
      isLeftPressed = false; 
     } 
     else if (SwingUtilities.isRightMouseButton (e)) 
     { 
      isRightPressed = false; 
     } 

     status.setText ("waiting for both mouse buttons..."); 
    } 

    public static void main (String[] args) 
    { 
     SwingUtilities.invokeLater (new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       new StackOverflow15957076(); 
      } 
     }); 
    } 
} 
+0

Chciałbym przegłosować, ale używałeś MouseEvent.BUTTON1/BUTTON3 zamiast metod SwingUtilities.isXXX (używanych przez OP), które są łatwiejsze do zrozumienia. – camickr

+0

dziękuję bardzo, to działa idealnie ... –

+0

@camickr Metody w 'SwingUtilities' są ładniejszą abstrakcją, ale myślę, że to ta sama funkcjonalność ... Używasz którejkolwiek myślisz, że jest najlepsza :). –

1

Wygląda na to, że nie można tego zrobić bezpośrednio, ponieważ zdarzenia myszy są uruchamiane sekwencyjnie. Zobacz na przykład this SO question/answers.

Musisz więc zdecydować, co "w tym samym czasie" oznacza dla ciebie (tzn. Jak blisko powinno być w czasie). Następnie możesz przechwycić dwa osobne zdarzenia i porównać ich wartości getWhen().