2012-01-23 23 views
22

Actualmente estoy desarrollando un programa en Java donde un determinado evento debe activarse solo cuando el usuario hace clic con el botón izquierdo y derecho en un botón.¿Qué botón del ratón es el del medio?

Dado que es un poco poco convencional, decidí probarlo primero. Aquí está:

import javax.swing.JFrame; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseEvent; 

public class GUI 
{ 
    private JFrame mainframe; 
    private JButton thebutton; 

    private boolean left_is_pressed; 
    private boolean right_is_pressed; 

    private JLabel notifier; 

    public GUI() 
    { 
     thebutton = new JButton ("Double Press Me"); 
     addListen(); 
     thebutton.setBounds (20, 20, 150, 40); 

     notifier = new JLabel (" "); 
     notifier.setBounds (20, 100, 170, 20); 

     mainframe = new JFrame ("Double Mouse Tester"); 
     mainframe.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE); 
     mainframe.setResizable (false); 
     mainframe.setSize (400, 250); 

     mainframe.setLayout (null); 

     mainframe.add (thebutton); 
     mainframe.add (notifier); 

     mainframe.setVisible (true); 

     left_is_pressed = right_is_pressed = false; 
    } 

    private void addListen() 
    { 
     thebutton.addMouseListener (new MouseListener() 
     { 
      @Override public void mouseClicked (MouseEvent e) { } 
      @Override public void mouseEntered (MouseEvent e) { } 
      @Override public void mouseExited (MouseEvent e) { } 

      @Override public void mousePressed (MouseEvent e) 
      { 
       //If left button pressed 
       if (e.getButton() == MouseEvent.BUTTON1) 
       { 
        //Set that it is pressed 
        left_is_pressed = true; 

        if (right_is_pressed) 
        { 
         //Write that both are pressed 
         notifier.setText ("Both pressed"); 
        } 

       } 
       //If right button pressed 
       else if (e.getButton() == MouseEvent.BUTTON3) 
       { 
        //Set that it is pressed 
        right_is_pressed = true; 

        if (left_is_pressed) 
        { 
         //Write that both are pressed 
         notifier.setText ("Both pressed"); 
        } 
       } 
      } 

      @Override public void mouseReleased (MouseEvent e) 
      { 
       //If left button is released 
       if (e.getButton() == MouseEvent.BUTTON1) 
       { 
        //Set that it is not pressed 
        left_is_pressed = false; 

        //Remove notification 
        notifier.setText (" "); 
       } 
       //If right button is released 
       else if (e.getButton() == MouseEvent.BUTTON3) 
       { 
        //Set that it is not pressed 
        right_is_pressed = false; 

        //Remove notification 
        notifier.setText (" "); 
       } 
      } 
     }); 
    } 
} 

Lo probé y funciona, pero hay un problema.

Como puede ver, el botón izquierdo del mouse está representado por MouseEvent.BUTTON1 y el botón secundario de mouse por MouseEvent.BUTTON3.

Si el usuario tiene un mouse que no tiene una rueda de desplazamiento (aparentemente tales ratones aún existen), solo se configuran dos botones en MouseEvent. ¿Eso significa que el botón derecho estará representado por MouseEvent.BUTTON2 en lugar de MouseEvent.BUTTON3? En caso afirmativo, ¿cómo puedo cambiar mi código para acomodar esto? ¿Hay alguna manera de que pueda detectar algo como esto?

He leído todo lo que he podido encontrar en la interfaz MouseListener y en MouseEvent, pero no he podido encontrar nada al respecto.

+0

@PetarMinchev esto no sería un problema si fuera el único usuario ... pero publicaré mi programa en línea para que muchas personas lo usen (o al menos lo prueben). –

+0

Correcto, estaba bromeando :) –

+0

Hay 3 ratones con botón sin rueda de desplazamiento. – Ingo

Respuesta

28

para determinar cuál de los botones del ratón está presionado, estos tres métodos de SwingUtilities podrían ayudarle a:

  1. isLeftMouseButton
  2. isMiddleMouseButton
  3. isRightMouseButton
+0

+1, buenos métodos :) –

+0

@mKorbel hmmm nice, no sabía que estos métodos existían. Entonces con esto puedo verificar si el mouse tiene una rueda. ¿Pero qué pasa con mi otra pregunta? (si no hay rueda, ¿debo verificar 'MouseEvent.BUTTON2' en lugar de' MouseEvent.BUTTON3'?) –

+0

Creo que ningún mouse (PS2/Server Console) tiene dos botones LEFT & RIGHT – mKorbel

13

Se pueden utilizar los métodos de servicios públicos desde SwingUtilties:

SwingUtilities.isLeftMouseButton(MouseEvent anEvent) 
SwingUtilities.isRightMouseButton(MouseEvent anEvent) 
SwingUtilities.isMiddleMouseButton(MouseEvent anEvent) 
0

También hay MouseEvent.isPopupTrigger(). Este método debería devolver verdadero, si se presiona el botón derecho del mouse.

Cuestiones relacionadas