Щелкните правой кнопкой мыши на JButton - PullRequest
14 голосов
/ 05 января 2010

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

Моя проблема в том, что я не знаю, как щелкнуть правой кнопкой мыши по кнопке 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». Но что еще более важно, это никак не влияет на нажатие кнопки.

РЕДАКТИРОВАТЬ: Mac имеют всплывающий триггер на mousePress, а не mouseClick.

РЕДАКТИРОВАТЬ: Вот решение, которое я разработал на основе принятого ответа:

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

Клон Сапер http://grab.by/1y9z

Ответы [ 8 ]

5 голосов
/ 05 января 2010

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

button.addMouseListener(new MouseAdapter(){
  public void mouseClicked(MouseEvent e){
    boolean mine = field.isMine(x, y);
    if (e.getButton() == MouseEvent.BUTTON2) {
      button.setText("F");
    }
  ...
5 голосов
/ 05 января 2010

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

mousePressed:

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

mouseReleased:

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

или делай там что хочешь.

2 голосов
/ 06 января 2010

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

1 голос
/ 05 января 2010

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

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

См. Также раздел API прослушивателя мыши в руководстве по Java Swing .

1 голос
/ 05 января 2010

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

среди других. Проверяйте их при срабатывании вашего события.

EDIT

public int getButton ()

Returns which, if any, of the mouse buttons has changed state. 
0 голосов
/ 05 января 2010

Это нормально работает на 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.

0 голосов
/ 05 января 2010

Если вы уверены, что событие правильно запускается (отладка FTW!) И что происходит button.setText ("F"), то, возможно, вам просто нужно перерисовать.

Перекрасить кнопку. http://java.sun.com/javase/6/docs/api/javax/swing/JComponent.html#repaint(java.awt.Rectangle)

0 голосов
/ 05 января 2010

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

...