Klicken Sie mit der rechten Maustaste auf Jbutton
Frage
Ich versuche, einen Minensweeper -Klon in Java zum Spaß zu schreiben. Ich habe ein Raster von Jbuttons, deren Etiketten ich ändern werde, um die Gefahrenanzahl, Flaggen usw. darzustellen.
Mein Problem ist, dass ich nicht weiß, wie ich mit der rechten Maustaste auf einen Jbutton klicken kann, um die Schaltfläche zu drücken. Ich habe Folgendes gemacht:
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");
}
}
}
});
Das scheint überhaupt nicht zu funktionieren; Das "F" wird nie gezeigt, nur der "x" -Teil. Aber was noch wichtiger ist, dass dies nichts dafür tut, den Knopf zu deprimieren.
Bearbeiten: Macs haben Popup -Trigger auf MousePress, nicht auf Mouseclick.
Bearbeiten: Hier ist die Lösung, die ich basierend auf der akzeptierten Antwort ausgearbeitet habe:
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);
Lösung
Die Taste kann nicht mit der rechten Maustaste gedrückt werden. Fügen Sie Ihrem Maushörer eine solche Zeilen hinzu
mousepression:
if(isRightButtonPressed) {underlyingButton.getModel().setPressed(true));
Mousereleased:
if(needReset) {underlyingButton.getModel().setPressed(false));
Oder tun Sie dort, was auch immer wollen.
Andere Tipps
Ich würde nicht benutzen isPopupTrigger
Überprüfen Sie jedoch direkt auf die rechte Taste:
button.addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent e){ boolean mine = field.isMine(x, y); if (e.getButton() == MouseEvent.BUTTON2) { button.setText("F"); } ...
Nur eine kleine Ergänzung: Der einfachste Weg, um die richtige Taste zu überprüfen, ist SwingUtilities.isRightMouseButton
http://java.sun.com/j2se/1.4.2/docs/api/java/awt/event/mouseeevent.html
MouseEvent hat einige Eigenschaften
static int BUTTON1
static int BUTTON2
static int BUTTON3
unter anderen. Überprüfen Sie diese, wenn Ihre Veranstaltung feuert.
BEARBEITEN
public int getbutton ()
Returns which, if any, of the mouse buttons has changed state.
Wie Sie bereits erwähnt haben, löste die Überprüfung nach "mousePressed" Ihr Problem. Und der Javadoc von ispopuptrigger würde die Notwendigkeit dafür erklären:
öffentlich boolean ispopuptrigger ()
...
Hinweis: Die Popup -Menüs werden in verschiedenen Systemen unterschiedlich ausgelöst. Daher sollte ISPOPUPTRIGGERGER sowohl in mouse-repariertem als auch in mouseröstetem überprüft werden, um eine ordnungsgemäße plattformübergreifende Funktionalität zu erhalten.
Siehe auch den Abschnitt auf Die Maushörer -API in der Java Schwingen Lernprogramm.
Die Schaltfläche ist sichtbar auf der rechten Maustaste zu deprimieren, ist nicht Teil des "normalen" Verhaltens von Schaltflächen. Möglicherweise können Sie es verwenden, indem Sie es verwenden JToggleButton
s oder einfach die Hintergrundfarbe der Schaltfläche und möglicherweise um Grenzen ändern, während die rechte Maustaste abgehalten wird.
Wenn Sie sicher sind, dass das Ereignis ordnungsgemäß ausgelöst wird (Debugg ftw!) Und dass der Button.setText ("f") stattfindet, müssen Sie vielleicht einfach neu streichen.
Die Schaltfläche neu streichen.http://java.sun.com/javase/6/docs/api/javax/swing/jcomponent.html#repaint(java.awt.rectangle)
Das funktioniert für mich gut auf 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();
}
}
Sie können genauso gut nach E.getButton () == 2 suchen, aber ich weiß nicht, wann dieser auf Macs ausgelöst wird.