7

Desidero implementare un metodo in cui l'utente deve tenere premuti i pulsanti sinistro e destro del mouse contemporaneamente.java swing tenere entrambi i pulsanti del mouse

Sto utilizzando Swing e Java 1.7. Ho provato questo, ma non rileva il caso pulsanti entrambi-come mi aspetto a:

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

ho cercato di separare i metodi e utilizzare i valori bool per decidere se viene premuto il pulsante del mouse e poi ho impostato una condizione per scoprire se entrambi sono premuti allo stesso tempo, ma anche questo ha funzionato ..

+2

'Ho provato a separare i metodi e utilizzare i valori bool per decidere se il pulsante del mouse è stato premuto e quindi ho impostato una condizione per scoprire se entrambi sono premuti allo stesso tempo, ma anche quella didint si risolve ..' - Sembra un approccio ragionevole. Pubblica il tuo [SSCCE] (http://sscce.org/) che mostra ciò che hai provato. – camickr

+0

grazie mille per il tuo interesse ... ma il postat di codice qui sotto funziona, era quasi lo stesso, ma la decodifica se il mouse è premuto era basata su if (SwingUtilities.isLeftMouseButton (e)) {left = true} e che non funzionava ... strano: D –

risposta

6

Questo è un SSCCE che fa ciò che vuoi ... cioè se ho capito correttamente la tua domanda .

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

Avrei svitato ma hai usato MouseEvent.BUTTON1/BUTTON3 invece dei metodi SwingUtilities.isXXX (usati dall'OP) che sono più facili da capire. – camickr

+0

grazie mille, questo funziona perfettamente ... –

+0

@ camickr I metodi in 'SwingUtilities' sono un'astrazione più carina, ma penso che sia la stessa funzionalità ... Tu usi quale-mai pensi che sia meglio :). –

1

Sembra che non è possibile farlo direttamente, dal momento che gli eventi del mouse vengono sparati in sequenza. Vedi, ad esempio, this SO question/answers.

Quindi sarà necessario decidere quale "allo stesso tempo" significa in realtà per voi (cioè quanto vicino nel tempo dovrebbe essere). Quindi puoi acquisire due eventi separati e confrontare i loro valori getWhen().