2017-10-03 31 views
0

Si j'ai deux boutons de la souris enfoncés, faites glisser la souris, puis relâchez l'un des boutons, comment puis-je déterminer quel bouton a été relâché? Les boutons maintenus sont récupérables avec un MouseEvent.getModifiersEx(), mais il ne semble pas y avoir de moyen de savoir lequel a été libéré, puisque tous les boutons pressés avant les déclencheurs d'événement sont stockés dans ce masque:Java AWT: Comment savoir quel bouton de la souris a été libéré après un événement mouseDragged?

public void mouseReleased(MouseEvent e) { 

    int b1 = MouseEvent.BUTTON1_DOWN_MASK; 
    int b2 = MouseEvent.BUTTON2_DOWN_MASK; 

    System.out.println(e.getButton()) // prints "0" when the mousereleased 
             // event follows a mouseDragged 
             // event 

    if ((mouseEvent.getModifiersEx() & b1) == b1) { 
     System.out.println("button 1 released"); 
    } else if ((mouseEvent.getModifiersEx() & b2) == b2) { 
     System.out.println("button 2 released"); 
    } 

    /* 
     Following a mouseDragged event, assuming button 1 and button 2 
     were pressed before either was released, the first if clause 
     evaluates to true regardless of which button was actually released. 
     In other words, releasing button 2 in this scenario will print 
     "button 1 released" 
    */ 

} 

il est facile si l'événement mouseReleased est précédée d'un événement mousePressed, mais quand il est précédé par mouseDragged, je ne peux pas simplement appeler getButton() ...

+1

Veuillez poster votre meilleure tentative [mcve] pour nous montrer comment votre code *** fonctionne *** correctement. –

+0

Avez-vous essayé 'SwingUtilities # isLeftMouseButton' et' isRightMouseButton'? –

+0

@HovercraftFullOfEels Merci pour vos commentaires. J'ai remplacé le bloc de code abstrait par un bloc concret pour mieux illustrer ma question. – DayTripperID

Répondre

1

mais quand il est précédé par mouseDragged, Je ne peux pas simplement appeler getButton() ...

Pourquoi pas?

Si vous voulez que l'état de la souris soit relâché après l'arrêt du glissement, utilisez peut-être un drapeau booléen dans votre MouseAdapter et définissez-le sur true lors du glissement. Quelque chose comme:

import java.awt.Dimension; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.*; 

public class MouseButtons extends JPanel { 
    private static final int PREF_W = 800; 
    private static final int PREF_H = 650; 

    public MouseButtons() { 
     MyMouseAdapter myMouse = new MyMouseAdapter(); 
     addMouseListener(myMouse); 
     addMouseMotionListener(myMouse); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private class MyMouseAdapter extends MouseAdapter { 
     private boolean dragging = false; 

     @Override 
     public void mousePressed(MouseEvent e) { 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
      String text = ""; 
      int button = e.getButton(); 
      if (button == MouseEvent.BUTTON1) { 
       text = "Button 1"; 
      } else if (button == MouseEvent.BUTTON2) { 
       text = "Button 2"; 
      } else if (button == MouseEvent.BUTTON3) { 
       text = "Button 3"; 
      } 

      if (dragging) { 
       System.out.println(text + " just finished dragging"); 
      } else { 
       System.out.println(text + " not recently dragging"); 
      } 
      dragging = false; 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 
      dragging = true; 
     } 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("MouseButtons"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new MouseButtons()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 

À moins que je suis tout à fait mal comprendre votre question, et si oui, alors je vous demander de clarifier un peu.