web-dev-qa-db-fra.com

Quel bouton de la souris est celui du milieu?

Je développe actuellement un programme en Java dans lequel un certain événement ne doit être déclenché que lorsque l'utilisateur clique avec un clic gauche ou droit sur un bouton.

Comme c'est un peu non conventionnel, j'ai décidé de le tester en premier. C'est ici:

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 (" ");
                }
            }
        });
    }
}

Je l'ai testé et cela fonctionne, mais il y a un problème.

Comme vous pouvez le constater, le bouton gauche de la souris est représenté par MouseEvent.BUTTON1 et le bouton droit de la souris par MouseEvent.BUTTON3.

Si l'utilisateur a une souris qui n'a pas de molette de défilement (apparemment, de telles souris existent toujours), seuls deux boutons sont définis dans MouseEvent. Cela signifie-t-il que le bouton droit sera représenté par MouseEvent.BUTTON2 au lieu de MouseEvent.BUTTON3? Si oui, comment puis-je changer mon code pour accepter cela? Y a-t-il un moyen de détecter quelque chose comme ça?

J'ai lu tout ce que je pouvais trouver sur l'interface MouseListener et sur MouseEvent, mais je n'ai rien trouvé à ce sujet.

23
Radu Murzea

Pour déterminer lequel des boutons de la souris est enfoncé, ces trois méthodes de SwingUtilities pourraient vous aider:

  1. isLeftMouseButton
  2. isMiddleMouseButton
  3. isRightMouseButton
30
mKorbel

Vous pouvez utiliser les méthodes utilitaires de SwingUtilties :

SwingUtilities.isLeftMouseButton(MouseEvent anEvent)   
SwingUtilities.isRightMouseButton(MouseEvent anEvent) 
SwingUtilities.isMiddleMouseButton(MouseEvent anEvent)
13
Alex

Il y a aussi MouseEvent.isPopupTrigger(). Cette méthode devrait retourner vrai si le bouton droit de la souris est enfoncé.

0
henrik