2010-01-05 30 views
14

Estoy tratando de escribir un clon Buscaminas en Java por diversión. Tengo una grilla de JButtons cuyas etiquetas cambiaré para representar el recuento de peligros, indicadores, etc.Haga clic derecho en JButton

Mi problema es que no sé cómo hacer clic con el botón derecho en un JButton para presionar el botón. 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 funcionar del todo; la "F" nunca se muestra, solo la parte "X". Pero más importante aún, esto no hace nada para presionar el botón.

EDITAR: Las Mac tienen un disparador emergente 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 clone http://grab.by/1y9z

+0

Y sí me doy cuenta de la junta final no debe tener todos los números mostrados. Solo estoy desarrollando. – I82Much

+0

¿Para qué necesitas estas cosas de 'popupTrigger'? Simplemente verifique los eventos mousePressed y verifique los modificadores del evento para BUTTON1_MASK o BUTTON2_MASK. –

Respuesta

5

No se puede presionar el botón con un clic derecho. Añadir líneas tales que le detector de ratón

mousePressed:

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

mouseReleased:

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

o hacer allí lo que falta.

+0

Voy a intentar esto esta noche; parece más prometedor – I82Much

+1

Para que las señales visuales funcionen correctamente, necesita llamar a setArmed() before setPressed() – I82Much

0

El botón de ser visiblemente deprimido en el clic derecho no es parte del comportamiento "normal" de los botones. Puede falsificarlo usando JToggleButton s, o simplemente cambiando el color de fondo del botón y quizás el borde mientras se mantiene presionado el botón derecho del mouse.

4

yo no utilizar 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"); 
    } 
    ... 
1

Como mencionaste al comprobar "mousePressed", resolvió el problema. Y el Javadoc de isPopupTrigger explicaría la necesidad de esto:

isPopupTrigger public boolean()
...
Nota: Los menús emergentes se activan de forma diferente en diferentes sistemas. Por lo tanto, isPopupTrigger debe verificarse en mousePressed y mouseReleased para una funcionalidad multiplataforma adecuada.

Véase también la sección sobre La API de ratón Listener en el tutorial de Java Swing.

0

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 Macs.

2

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

+0

Esto no funciona para ctrl + clic en mac que normalmente activa el clic derecho. – I82Much

Cuestiones relacionadas