Щелкните правой кнопкой мыши на 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 или просто изменить цвет фона кнопки и, возможно, на границе, пока правая кнопка мыши удерживается.
Ответ 7
Если вы уверены, что событие правильно запущено (debug FTW!) и что button.setText( "F" ) происходит, возможно, вам просто нужно перерисовать.
Перекрасьте кнопку.
http://java.sun.com/javase/6/docs/api/javax/swing/JComponent.html#repaint(java.awt.Rectangle)
Ответ 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.