Вопрос

Я пытаюсь написать клон Сапера на 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».Но что еще более важно, это не влияет на нажатие кнопки.

РЕДАКТИРОВАТЬ:На компьютерах Mac триггер всплывающего окна происходит при нажатии мыши, а не при нажатии мыши.

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

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

Это было полезно?

Решение

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

мыслил:

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

мыслили:

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

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

Другие советы

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

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

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

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. 

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

Общественный логический ispopuptrigger ()
...
Примечание. Всплывающие меню по -разному запускаются в разных системах. Следовательно, ispopuptrigger следует проверить как в мышке, так и в мышленном для правильной кроссплатформенной функции.

Также см. Раздел о API слушателя мыши на Java Качать руководство.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top