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

Я пытаюсь записать клон Минного тральщика в 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 имеют всплывающий триггер, происходят при щелчке мышью, не щелкают мышью.

Править: Вот решение, которое я разработал базирующийся прочь принятого ответа:

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

15
задан I82Much 6 January 2010 в 02:10
поделиться

8 ответов

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

mousePressed:

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

mouseReleased:

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

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

.
5
ответ дан 1 December 2019 в 04:34
поделиться

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

2
ответ дан 1 December 2019 в 04:34
поделиться

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

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

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

.
1
ответ дан 1 December 2019 в 04:34
поделиться

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

Repaint the button. http://java.sun.com/javase/6/docs/api/javax/swing/JComponent.html#repaint(java.awt.Rectangle)

0
ответ дан 1 December 2019 в 04:34
поделиться

Это прекрасно работает для меня на 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, но я не знаю, когда это срабатывает на Macs.

.
0
ответ дан 1 December 2019 в 04:34
поделиться

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. 
1
ответ дан 1 December 2019 в 04:34
поделиться

Я бы не стал использовать 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
ответ дан 1 December 2019 в 04:34
поделиться

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

0
ответ дан 1 December 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: