Я пытаюсь записать клон Минного тральщика в 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);
Кнопка не может быть нажата правой кнопкой мыши. Добавьте такие строки к своему слушателю мыши
mousePressed:
if(isRightButtonPressed) {underlyingButton.getModel().setPressed(true));
mouseReleased:
if(needReset) {underlyingButton.getModel().setPressed(false));
или делайте там что хотите.
. Небольшое дополнение: самый простой способ проверки правой кнопки - SwingUtilities. isRightMouseButton
Как вы уже упоминали, проверка на "mousePressed" решила вашу проблему. И Javadoc из isPopupTrigger объяснил бы необходимость этого:
public boolean isPopupTrigger()
...
Примечание: всплывающие меню срабатывают по-разному на разных системах. Поэтому для правильной кроссплатформенной функциональности необходимо проверять isPopupTrigger как в mousePressed, так и в mouseReleased.
См. также раздел API прослушивателя мыши в руководстве Java Swing.
.Если вы уверены, что событие правильно сработало (отладка FTW!) и что происходит button.setText("F"), то, возможно, вам просто нужно перерисовать.
Repaint the button. 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, но я не знаю, когда это срабатывает на Macs.
.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.
Я бы не стал использовать isPopupTrigger
, но сразу проверьте, нет ли правой кнопки:
button.addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent e){ boolean mine = field.isMine(x, y); if (e.getButton() == MouseEvent.BUTTON2) { button.setText("F"); } ...
Заметное нажатие на кнопку правой кнопкой не является частью "нормального" поведения кнопок. Вы можете подделать ее, используя JToggleButton
s, или просто изменив цвет фона и, возможно, рамки при нажатой правой кнопке мыши.