Pregunta

Estoy intentando escribir un clon dragaminas en Java para la diversión. Tengo una cuadrícula de JButtons cuyas etiquetas voy a cambiar para representar el peligro contar, banderas, etc.

Mi problema es que no sé cómo conseguir un clic derecho en un JButton para presionar el botón. Yo he hecho lo siguiente:

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

Esto no parece estar funcionando en absoluto; la "F" no se muestra, sólo el "X" parte. Pero lo más importante, esto no hace nada para presionar el botón.

Edit: Macs tienen emergente gatillo suceda en mousePress, no MouseClick.

EDIT: Aquí está la solución que funcionó con sede fuera de respuesta aceptada:

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 clon http://grab.by/1y9z

¿Fue útil?

Solución

El botón no puede ser presionado por el botón derecho del ratón. Añadir líneas tales que le oyente de mouse

mousePressed:

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

mouseReleased:

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

o hacer allí lo que sea la necesidad.

Otros consejos

Yo no usaría isPopupTrigger pero consulte directamente para el botón derecho:

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

Sólo una pequeña adición: la forma más sencilla para comprobar si el botón derecho es SwingUtilities.isRightMouseButton

http: // java .sun.com / j2se / 1.4.2 / docs / api / java / awt / evento / MouseEvent.html

MouseEvent tiene algunas propiedades

static int BUTTON1
static int BUTTON2
static int BUTTON3

entre otros. Compruebe los cuando los incendios de evento.

editar

  

int pública getButton ()

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

Como se ha mencionado que la comprobación de "mousePressed" resuelve su problema. Y el Javadoc de isPopupTrigger explicaría la necesidad de esto:

isPopupTrigger pública booleano ()
...
Nota: Los menús emergentes se activan de forma diferente en diferentes sistemas. Por lo tanto, isPopupTrigger debe verificarse tanto en mousePressed y mouseReleased de funcionamiento correcto de plataforma cruzada.

También vea la sección La API de ratón Listener en el Java oscilación tutorial.

El botón de ser visiblemente deprimido en el clic derecho no es parte del comportamiento "normal" de los botones. Usted puede ser capaz de fingir usando JToggleButtons, o simplemente cambiando el color de fondo del botón y tal vez la frontera mientras que el botón derecho del ratón se mantiene presionado.

Si está seguro de que el evento está siendo adecuadamente activa (depuración FTW!) Y que el button.setText ( "F") que está sucediendo, entonces tal vez sólo tendrá que volver a pintar.

Volver a pintar el botón. http: / /java.sun.com/javase/6/docs/api/javax/swing/JComponent.html#repaint(java.awt.Rectangle)

Esto funciona muy bien para mí en 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();
    }

}

Es lo mismo que comprobar si hay e.getButton () == 2, pero no sé cuando éste se activa en los Mac.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top