Faites un clic droit sur DButton
Question
Je suis en train d'écrire un clone Démineur en Java pour le plaisir. J'ai une grille de JButton dont le nombre d'étiquettes que je changerai pour représenter le danger, drapeaux, etc.
Mon problème est, je ne sais pas comment obtenir un clic droit sur un JButton pour appuyer sur le bouton. Je l'ai fait ce qui suit:
button.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
boolean mine = field.isMine(x, y);
if (e.isPopupTrigger()) {
button.setText("F");
}
else {
if (mine) {
button.setText("X");
}
}
}
});
Cela ne semble pas fonctionner du tout; l'est jamais montré « F », seule la partie « X ». Mais plus important encore, cela ne fait rien pour appuyer sur le bouton.
EDIT: Mac ont déclencheur pop-up se produire sur mousePress, pas mouseClick.
EDIT: Voici la solution que je travaille sur la base hors de la réponse acceptée:
button.addMouseListener(new MouseAdapter(){
boolean pressed;
@Override
public void mousePressed(MouseEvent e) {
button.getModel().setArmed(true);
button.getModel().setPressed(true);
pressed = true;
}
@Override
public void mouseReleased(MouseEvent e) {
//if(isRightButtonPressed) {underlyingButton.getModel().setPressed(true));
button.getModel().setArmed(false);
button.getModel().setPressed(false);
if (pressed) {
if (SwingUtilities.isRightMouseButton(e)) {
button.setText("F");
}
else {
button.setText("X");
}
}
pressed = false;
}
@Override
public void mouseExited(MouseEvent e) {
pressed = false;
}
@Override
public void mouseEntered(MouseEvent e) {
pressed = true;
}
});
add(button);
La solution
Bouton ne peut pas être pressé par un clic droit. Ajouter une telle ligne vous écouteur de souris
mousePressed:
if(isRightButtonPressed) {underlyingButton.getModel().setPressed(true));
mouseReleased:
if(needReset) {underlyingButton.getModel().setPressed(false));
ou y faire tout besoin.
Autres conseils
Je ne voudrais pas utiliser isPopupTrigger
mais il faut vérifier directement le bouton droit:
button.addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent e){ boolean mine = field.isMine(x, y); if (e.getButton() == MouseEvent.BUTTON2) { button.setText("F"); } ...
Juste un petit plus: la façon la plus simple pour vérifier le bouton droit est SwingUtilities.isRightMouseButton
http: // java .sun.com / J2SE / 1.4.2 / docs / api / java / AWT / événement / MouseEvent.html
MouseEvent a des propriétés
static int BUTTON1
static int BUTTON2
static int BUTTON3
entre autres. Vérifiez quand les feux de votre événement.
EDIT
int getButton (public)
Returns which, if any, of the mouse buttons has changed state.
Comme vous l'avez mentionné que la vérification des « mousePressed » résoudre votre problème. Et le Javadoc de isPopupTrigger expliquerait la nécessité de ceci:
isPopupTrigger public boolean ()
...
Note: Les menus contextuels sont déclenchées différemment sur différents systèmes. Par conséquent, isPopupTrigger doit être vérifiée dans les deux mousePressed et mouseReleased pour la fonctionnalité multi-plateforme appropriée.
Voir aussi la section L'API souris Listener dans Java tutoriel de swing.
Le bouton étant visiblement déprimé sur un clic droit ne fait pas partie du comportement « normal » des boutons. Vous pourrez peut-être faux à l'aide JToggleButton
s, ou simplement changer la couleur d'arrière-plan du bouton et peut-être la frontière tandis que le bouton droit de la souris est maintenu.
Si vous êtes certain que l'événement est correctement déclenchée (debug FTW!) Et que le button.setText ( « F ») qui se passe, alors peut-être il vous suffit de repeindre.
Repeindre le bouton. http: / /java.sun.com/javase/6/docs/api/javax/swing/JComponent.html#repaint(java.awt.Rectangle)
Cela fonctionne pour moi bien sur Mac:
import java.awt.event.*;
import javax.swing.*;
public class ButtonTest extends JFrame {
JButton button;
public ButtonTest() {
button = new JButton("W");
button.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getButton() == 3) { // if right click
button.setText("F");
button.getModel().setPressed(false);
// button.setEnabled(true);
} else {
button.setText("X");
button.getModel().setPressed(true);
// button.setEnabled(false);
}
}
});
this.add(button);
this.setVisible(true);
}
public static void main(String[] args) {
new ButtonTest();
}
}
Vous pourriez aussi bien vérifier e.getButton () == 2 mais je ne sais pas quand celui-ci est déclenchée sur Mac.