2010-01-05 3 views
14

Sto cercando di scrivere un clone del campo minato in Java per divertimento. Ho una griglia di JButtons le cui etichette cambierò per rappresentare il conteggio dei pericoli, le bandiere, ecc.Fare clic con il tasto destro su JButton

Il mio problema è che non so come ottenere un clic destro su un pulsante JB per premere il pulsante. Ho fatto quanto segue:

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 affatto; la "F" non viene mai mostrata, solo la parte "X". Ma ancora più importante, questo non fa nulla per deprimere il pulsante.

MODIFICA: i Mac hanno l'attivazione popup su mousePress, non su mouseClick.

EDIT: Ecco la soluzione Ho lavorato in base al largo di risposta accettata:

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

E sì mi rendo conto il consiglio finale non dovrebbe avere tutti quei numeri indicati. Sto solo sviluppando. – I82Much

+0

A cosa serve questa roba 'popupTrigger'? Basta controllare gli eventi mousePressed e controllare i modificatori dell'evento per BUTTON1_MASK o BUTTON2_MASK. –

risposta

5

Il pulsante non può essere premuto facendo clic con il pulsante destro del mouse. Aggiungere una tale linee per il mouse ascoltatore

mousePressed:

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

mouseReleased:

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

o fare lì qualunque cosa voglia.

+0

Lo proverò stasera; sembra molto promettente. – I82Much

+1

Affinché i segnali visivi funzionino correttamente, è necessario chiamare setArmed() prima di setPressed() – I82Much

1

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

MouseEvent ha alcune proprietà

static int BUTTON1 
static int BUTTON2 
static int BUTTON3 

tra gli altri. Controlla quelli quando il tuo evento si attiva.

EDIT

public int getButton()

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

Grazie, posso ottenere quale pulsante è stato premuto, ma non è più un mio problema. – I82Much

0

Il pulsante essendo visibilmente depresso sul tasto destro del mouse non è parte del comportamento "normale" di pulsanti. Potresti riuscire a simularlo utilizzando JToggleButton s o semplicemente cambiando il colore di sfondo del pulsante e magari il bordo mentre il pulsante destro del mouse viene tenuto premuto.

4

non vorrei usare isPopupTrigger ma verificare direttamente per 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"); 
    } 
    ... 
1

Come si è detto, il controllo di "mousePressed" ha risolto il problema. E Javadoc di isPopupTrigger spiegherebbe la necessità di questo:

pubblico isPopupTrigger booleana()
...
Nota: i menu popup vengono attivati ​​in modo diverso su sistemi diversi. Pertanto, isPopupTrigger deve essere controllato sia in mousePressed che mouseReleased per una corretta funzionalità multipiattaforma.

Vedere anche la sezione su L'API di ascolto del mouse nell'esercitazione Java Swing.

0

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 su Mac.

2

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

+0

Ciò non funziona per ctrl + clic su mac che di solito attiva il tasto destro del mouse. – I82Much