2010-06-16 5 views
1

Celui-ci est assez fou:MouseListener tiré sans vérifier JCheckBox

J'ai un enregistrement AppSight (pour ceux qui ne connaissent pas, il est un enregistrement de ce qu'ils ont compris clavier/souris d'entrée + trafic réseau, etc.) de un client reproduisant un bug. Fondamentalement, nous avons une série d'éléments répertoriés sur l'écran avec JCheckBox-es sur le côté gauche. Nous avons un ensemble de MouseListener pour les JPanel qui ressemble à quelque chose comme ceci:

private MouseAdapter createMouseListener() { 
    return new MouseAdapter(){ 
     public void mousePressed(MouseEvent e) { 

      if(e.getComponent() instanceof JCheckBox) { 
       // Do stuff 
      } 
     } 
    }; 
} 

Sur la base de l'enregistrement, il semble très fortement de cliquer juste au-dessus l'une des cases à cocher. Après cela, je crois que cet auditeur a tiré et que le bloc "Do stuff" s'est produit. Cependant, il n'a pas vérifié la boîte. L'utilisateur a alors vu que la boîte n'était pas cochée, alors ils ont cliqué dessus. Cela a provoqué le feu du bloc "Do stuff", annulant ainsi ce qu'il avait fait la première fois. Cette fois, la boîte a été vérifiée. Par conséquent, l'utilisateur pense que la case est cochée, et il semble que ce soit le cas, mais notre client pense que la case n'est pas cochée car elle a été cliquée deux fois.

Est-ce possible? Pour la vie de moi, je ne peux pas le reproduire ou voir comment cela pourrait être possible, mais en fonction de l'enregistrement et des données envoyées par le client au serveur, je ne vois aucune autre explication logique.

Toute aide, toute pensée ou idée serait grandement appréciée.

Répondre

2

Peut-être que l'utilisateur a cliqué sur la case à cocher, mais avant de relâcher le bouton de la souris, il a éloigné la souris du composant. Je suis assez sûr que la chechbox ne sera pas vérifiée dans ce cas, bien que pas si sûr sur le comportement Thread Event dans ce scénario.

+0

Dès que j'ai lu cette réponse, je savais que c'était juste. Tiré ouvrir l'application et dupliqué premier essai. Merci pour l'aide! – Morinar

+0

Je suis heureux de pouvoir aider! :) –

1

Je ne pense pas que vous pouvez supposer que parce que la souris a été pressé sur la case à cocher qu'il sera également publié sur la case à cocher. Peut-être juste faire quelque chose comme ceci:

private MouseAdapter createMouseListener() { 
    return new MouseAdapter(){ 
     public void mouseReleased(MouseEvent e) { 

      if(e.getComponent() instanceof JCheckBox) { 
       // And just to be sure.... 
       JCheckBox jcb = (JCheckBox) e.getComponent(); 
       if(jcb.isSelected()) 
       { 
        // Do stuff 
       } 
      } 
     } 
    }; 
} 
Questions connexes