Clique com o botão direito do mouse no jbutton
Pergunta
Estou tentando escrever um clone do Minesweeper em Java por diversão. Eu tenho uma grade de jbuttons cujos rótulos mudarei para representar a contagem de perigos, bandeiras, etc.
Meu problema é que não sei como obter um clique com o botão direito em um jbutton para pressionar o botão. Eu fiz o seguinte:
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");
}
}
}
});
Isso não parece estar funcionando; O "F" nunca é mostrado, apenas a parte "X". Mas o mais importante é que isso não faz nada para deprimir o botão.
EDIT: Os Macs têm gatilho pop -up no MousePress, não no Mouseclick.
EDIT: Aqui está a solução que trabalhei com base na resposta aceita:
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);
Solução
O botão não pode ser pressionado clique com o botão direito do mouse. Adicione essas linhas ao seu ouvinte de mouse
Mouse pressionado:
if(isRightButtonPressed) {underlyingButton.getModel().setPressed(true));
MouseReleded:
if(needReset) {underlyingButton.getModel().setPressed(false));
ou faça lá o que quiser.
Outras dicas
Eu não usaria isPopupTrigger
Mas verifique diretamente o botão direito:
button.addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent e){ boolean mine = field.isMine(x, y); if (e.getButton() == MouseEvent.BUTTON2) { button.setText("F"); } ...
Apenas uma pequena adição: a maneira mais simples de verificar o botão certo é SwingUtilities.isRightMouseButton
http://java.sun.com/j2se/1.4.2/docs/api/java/awt/event/mouseevent.html
Mouseevent tem algumas propriedades
static int BUTTON1
static int BUTTON2
static int BUTTON3
entre outros. Verifique aqueles quando o seu evento dispara.
EDITAR
public int getButton ()
Returns which, if any, of the mouse buttons has changed state.
Como você mencionou, a verificação de "MousePressed" resolveu seu problema. E o javadoc de ISPOPUPTRIGGER explicaria a necessidade disso:
public boolean ispopupTrigger ()
...
Nota: Os menus pop -up são desencadeados de maneira diferente em diferentes sistemas. Portanto, o ISPOPUPTRIGGER deve ser verificado no mouse pressionado e no mousereleamento para obter a funcionalidade de plataforma cruzada adequada.
Veja também a seção em A API do ouvinte do mouse no java Balanço tutorial.
O botão sendo visivelmente deprimido no clique direito não faz parte do comportamento "normal" dos botões. Você pode ser capaz de fingir usando JToggleButton
S, ou simplesmente alterar a cor de fundo do botão e talvez a borda enquanto o botão direito do mouse está sendo retido.
Se você tem certeza de que o evento está sendo acionado corretamente (Debug FTW!) E que o botão.Settext ("F") está acontecendo, talvez você simplesmente precise repintar.
Repintar o botão.http://java.sun.com/javase/6/docs/api/javax/swing/jcomponent.html#repaint(java.awt.rectangle)
Isso funciona bem para mim no 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();
}
}
Você também pode verificar e.getButton () == 2, mas eu não sei quando este é acionado no Macs.