¿Qué botón del ratón es el del medio?


Actualmente estoy desarrollando un programa en Java donde un cierto evento debe activarse solo cuando el usuario hace clic con el botón izquierdo y el botón derecho en un botón.

Dado que es un poco poco convencional, decidí probar primero esto. 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 ratón está representado por MouseEvent.BUTTON1 y el botón derecho del ratón por MouseEvent.BUTTON3.

Si el usuario tiene un ratón que no tiene un rueda de desplazamiento (aparentemente tales ratones todavía existen), entonces solo dos botones se establecen en MouseEvent. ¿Significa eso 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 adaptarlo? Hay alguna manera de que pueda detectar algo como esto?

Leí todo lo que pude encontrar en la interfaz MouseListener y en MouseEvent, pero no pude encontrar algo sobre esto.

Author: Peter Mortensen, 2012-01-23

3 answers

Para determinar cuál de los botones del ratón se presiona, estos tres métodos de SwingUtilities podrían ayudarlo:

  1. isLeftMouseButton
  2. isMiddleMouseButton
  3. Está justo debajo del botón
 29
Author: mKorbel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-11 18:32:55

Puede usar los métodos de utilidades de SwingUtilties :

SwingUtilities.isLeftMouseButton(MouseEvent anEvent)   
SwingUtilities.isRightMouseButton(MouseEvent anEvent) 
SwingUtilities.isMiddleMouseButton(MouseEvent anEvent)
 13
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-23 13:28:59

También Hay MouseEvent.isPopupTrigger(). Este método debe devolver true, si se presiona el botón derecho del ratón.

 0
Author: henrik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-23 13:30:06