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);

Démineur clone http://grab.by/1y9z

Était-ce utile?

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 JToggleButtons, 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.

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top