Pergunta

Estou tentando escrever um clone do Minesweeper em Java por diversão. Eu tenho uma grade de jbuttons cujos rótulos mudarei para representar a contagem de perigos, bandeiras, etc.

Meu problema é que não sei como obter um clique com o botão direito em um jbutton para pressionar o botão. Eu fiz o seguinte:

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

Isso não parece estar funcionando; O "F" nunca é mostrado, apenas a parte "X". Mas o mais importante é que isso não faz nada para deprimir o botão.

EDIT: Os Macs têm gatilho pop -up no MousePress, não no Mouseclick.

EDIT: Aqui está a solução que trabalhei com base na resposta aceita:

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

CLONE MINESWEEPER http://grab.by/1y9z

Foi útil?

Solução

O botão não pode ser pressionado clique com o botão direito do mouse. Adicione essas linhas ao seu ouvinte de mouse

Mouse pressionado:

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

MouseReleded:

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

ou faça lá o que quiser.

Outras dicas

Eu não usaria isPopupTrigger Mas verifique diretamente o botão direito:

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

Apenas uma pequena adição: a maneira mais simples de verificar o botão certo é SwingUtilities.isRightMouseButton

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

Mouseevent tem algumas propriedades

static int BUTTON1
static int BUTTON2
static int BUTTON3

entre outros. Verifique aqueles quando o seu evento dispara.

EDITAR

public int getButton ()

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

Como você mencionou, a verificação de "MousePressed" resolveu seu problema. E o javadoc de ISPOPUPTRIGGER explicaria a necessidade disso:

public boolean ispopupTrigger ()
...
Nota: Os menus pop -up são desencadeados de maneira diferente em diferentes sistemas. Portanto, o ISPOPUPTRIGGER deve ser verificado no mouse pressionado e no mousereleamento para obter a funcionalidade de plataforma cruzada adequada.

Veja também a seção em A API do ouvinte do mouse no java Balanço tutorial.

O botão sendo visivelmente deprimido no clique direito não faz parte do comportamento "normal" dos botões. Você pode ser capaz de fingir usando JToggleButtonS, ou simplesmente alterar a cor de fundo do botão e talvez a borda enquanto o botão direito do mouse está sendo retido.

Se você tem certeza de que o evento está sendo acionado corretamente (Debug FTW!) E que o botão.Settext ("F") está acontecendo, talvez você simplesmente precise repintar.

Repintar o botão.http://java.sun.com/javase/6/docs/api/javax/swing/jcomponent.html#repaint(java.awt.rectangle)

Isso funciona bem para mim no 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();
    }

}

Você também pode verificar e.getButton () == 2, mas eu não sei quando este é acionado no Macs.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top