Haga clic derecho sobre JButton
Pregunta
Estoy intentando escribir un clon dragaminas en Java para la diversión. Tengo una cuadrícula de JButtons cuyas etiquetas voy a cambiar para representar el peligro contar, banderas, etc.
Mi problema es que no sé cómo conseguir un clic derecho en un JButton para presionar el botón. Yo he hecho lo siguiente:
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");
}
}
}
});
Esto no parece estar funcionando en absoluto; la "F" no se muestra, sólo el "X" parte. Pero lo más importante, esto no hace nada para presionar el botón.
Edit: Macs tienen emergente gatillo suceda en mousePress, no MouseClick.
EDIT: Aquí está la solución que funcionó con sede fuera de respuesta aceptada:
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);
Solución
El botón no puede ser presionado por el botón derecho del ratón. Añadir líneas tales que le oyente de mouse
mousePressed:
if(isRightButtonPressed) {underlyingButton.getModel().setPressed(true));
mouseReleased:
if(needReset) {underlyingButton.getModel().setPressed(false));
o hacer allí lo que sea la necesidad.
Otros consejos
Yo no usaría isPopupTrigger
pero consulte directamente para el botón derecho:
button.addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent e){ boolean mine = field.isMine(x, y); if (e.getButton() == MouseEvent.BUTTON2) { button.setText("F"); } ...
Sólo una pequeña adición: la forma más sencilla para comprobar si el botón derecho es SwingUtilities.isRightMouseButton
http: // java .sun.com / j2se / 1.4.2 / docs / api / java / awt / evento / MouseEvent.html
MouseEvent tiene algunas propiedades
static int BUTTON1
static int BUTTON2
static int BUTTON3
entre otros. Compruebe los cuando los incendios de evento.
editar
int pública getButton ()
Returns which, if any, of the mouse buttons has changed state.
Como se ha mencionado que la comprobación de "mousePressed" resuelve su problema. Y el Javadoc de isPopupTrigger explicaría la necesidad de esto:
isPopupTrigger pública booleano ()
...
Nota: Los menús emergentes se activan de forma diferente en diferentes sistemas. Por lo tanto, isPopupTrigger debe verificarse tanto en mousePressed y mouseReleased de funcionamiento correcto de plataforma cruzada.
También vea la sección La API de ratón Listener en el Java oscilación tutorial.
El botón de ser visiblemente deprimido en el clic derecho no es parte del comportamiento "normal" de los botones. Usted puede ser capaz de fingir usando JToggleButton
s, o simplemente cambiando el color de fondo del botón y tal vez la frontera mientras que el botón derecho del ratón se mantiene presionado.
Si está seguro de que el evento está siendo adecuadamente activa (depuración FTW!) Y que el button.setText ( "F") que está sucediendo, entonces tal vez sólo tendrá que volver a pintar.
Volver a pintar el botón. http: / /java.sun.com/javase/6/docs/api/javax/swing/JComponent.html#repaint(java.awt.Rectangle)
Esto funciona muy bien para mí en 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();
}
}
Es lo mismo que comprobar si hay e.getButton () == 2, pero no sé cuando éste se activa en los Mac.