Domanda

Sto cercando di scrivere un Dragamine clone in Java per divertimento.Ho una griglia di JButtons le cui etichette voglio cambiare per rappresentare il pericolo conte, bandiere, etc.

Il mio problema è che non so come ottenere un clic destro su un JButton per premere il pulsante.Ho fatto la seguente:

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

Questo non sembra funzionare a tutti;la "F" non viene mai mostrato, solo la "X" parte.Ma, cosa più importante, non fa nulla per premere il pulsante.

EDIT:I mac hanno popup trigger accadere mousePress, non clic del mouse.

EDIT:Ecco la soluzione che ho elaborato in base accettato di rispondere:

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

Minesweeper clone http://grab.by/1y9z

È stato utile?

Soluzione

Il pulsante non può essere premuto dal tasto destro del mouse. Aggiungere una tale linee a voi listener del mouse

mousePressed:

if(isRightButtonPressed) {underlyingButton.getModel().setPressed(true));

mouseReleased:

if(needReset) {underlyingButton.getModel().setPressed(false));

o fare lì qualunque cosa voglia.

Altri suggerimenti

Non vorrei usare isPopupTrigger ma controllare direttamente il tasto destro:

button.addMouseListener(new MouseAdapter(){
  public void mouseClicked(MouseEvent e){
    boolean mine = field.isMine(x, y);
    if (e.getButton() == MouseEvent.BUTTON2) {
      button.setText("F");
    }
  ...

Basta una piccola aggiunta: il modo più semplice per controllare il tasto destro è SwingUtilities.isRightMouseButton

http: // java .sun.com / J2SE / 1.4.2 / docs / api / java / AWT / evento / MouseEvent.html

MouseEvent ha alcune proprietà

static int BUTTON1
static int BUTTON2
static int BUTTON3

tra gli altri. Controllare quelle in cui i tuoi generato l'evento.

Modifica

  

public int getButton ()

Returns which, if any, of the mouse buttons has changed state. 

Come lei ha detto che il controllo per "mousePressed" risolto il tuo problema.E il Javadoc di isPopupTrigger spiegherebbe la necessità di questo:

public boolean isPopupTrigger()
...
Nota:Menu a comparsa che si sono attivati in modo diverso su diversi sistemi.Pertanto, isPopupTrigger dovrebbe essere controllato sia mousePressed e mouseReleased per la corretta funzionalità multipiattaforma.

Vedere anche la sezione Il Mouse Listener API in Java Swing tutorial.

Il pulsante essendo visibilmente depresso sul tasto destro del mouse non è parte del comportamento "normale" di pulsanti. Si può essere in grado di fingere con JToggleButtons, o semplicemente cambiando il colore di sfondo del pulsante e forse di confine, mentre il tasto destro del mouse viene tenuto premuto.

Se si è certi che l'evento sia correttamente viene attivato (debug FTW!) E che il button.setText ( "F") che sta accadendo, allora forse avete semplicemente bisogno di ridisegnare.

ridipingere il tasto. http: / /java.sun.com/javase/6/docs/api/javax/swing/JComponent.html#repaint(java.awt.Rectangle)

Questo funziona per me bene su 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();
    }

}

Si potrebbe anche verificare la presenza di e.getButton () == 2, ma io non so quando questo viene attivato sui Mac.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top