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);

Minesweeper Clone http://grab.by/1y9z

War es hilfreich?

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 JToggleButtons 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top