Щелкните правой кнопкой мыши на JButton

Я пытаюсь написать клон Minesweeper в Java для удовольствия. У меня есть сетка JButtons, чьи метки я буду менять, чтобы представить количество опасностей, флаги и т.д.

Моя проблема в том, что я не знаю, как правильно щелкнуть JButton, чтобы нажать кнопку. Я сделал следующее:

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

Это вообще не работает; "F" никогда не отображается, только часть "X". Но что более важно, это ничего не делает для нажатия кнопки.

РЕДАКТИРОВАТЬ: У Macs есть триггер popup на mousePress, а не на mouseClick.

EDIT: Здесь решение, которое я разработал, основывается на принятом ответе:

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

Ответы

Ответ 1

Кнопка не может быть нажата нажатием правой кнопки мыши. Добавьте такие строки в ваш слушатель мыши

mousePressed:

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

mouseReleased:

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

или делать что угодно.

Ответ 2

Я бы не использовал isPopupTrigger, но прямо проверял правильную кнопку:

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

Ответ 3

Просто небольшое дополнение: самый простой способ проверить правильную кнопку - SwingUtilities.isRightMouseButton

Ответ 4

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

MouseEvent имеет некоторые свойства

static int BUTTON1
static int BUTTON2
static int BUTTON3

среди прочих. Проверьте их при срабатывании события.

ИЗМЕНИТЬ

public int getButton()

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

Ответ 5

Как вы уже упоминали, проверка "mousePressed" решила вашу проблему. И Javadoc isPopupTrigger объясняет необходимость в этом:

public boolean isPopupTrigger()
...
Примечание. Всплывающие меню запускаются по-разному в разных системах. Поэтому isPopupTrigger следует проверять как в mousePressed, так и в mouseReleased для правильной межплатформенной функциональности.

Также см. раздел API-интерфейс прослушивания мыши в учебнике Java Swing.

Ответ 6

Кнопка, видимо нажатая на правый щелчок, не является частью "нормального" поведения кнопок. Вы можете подделать его с помощью JToggleButton s или просто изменить цвет фона кнопки и, возможно, на границе, пока правая кнопка мыши удерживается.

Ответ 8

Это работает для меня отлично на 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();
    }

}

Вы также можете проверить e.getButton() == 2, но я не знаю, когда этот запуск запускается на компьютерах Mac.