7 Stimmen

Java: Verwendung eines Actionlisteners zum Aufrufen einer Funktion in einer anderen Klasse für ein Objekt dieser Klasse

Im Grunde genommen möchte ich eine Start-Schaltfläche, um eine Methode in einer anderen Klasse zu starten, die auf ein anderes Objekt wirkt.

Mein Code für den Hörer:

button1a.addActionListener(new ActionListener() {
    public void actionPerformed (ActionEvent event) {
        // Figure out how to make this work
        //sim.runCastleCrash(); 
    }
} );

Mein Code für die andere Klasse:

public static void main(String[] args) {
    CastleCrash sim;
    sim = new CastleCrash();
}

y

public void runCastleCrash() {
    System.out.println("Castle Crash is beginning...");
    //Other method parts here to be added
}

Ich habe das Gefühl, dass das nicht allzu schwer sein kann, aber mir fehlt ein Teil.

1 Stimmen

Welche Fehler erhalten Sie? Ist die sim Variable sogar im Anwendungsbereich, wenn Sie versuchen, den actionListener zur Schaltfläche hinzuzufügen? Ein typischer Fallstrick ist, dass Variablen final sein müssen, damit sie von einer anonymen inneren Klasse wie dem ActionListener zugänglich sind.

0 Stimmen

Ich erhalte die Fehlermeldung: Exception in thread "main" java.lang.Error: Unresolved compilation problem: sim cannot be resolved Ich denke, Sie haben Recht, dass es ein Problem mit sim ist nicht in den Bereich, aber ich kann nicht herausfinden, wie man es endgültig ....

0 Stimmen

Siehe die Antwort von McDowell, das ist es, was ich antworten würde.

5voto

McDowell Punkte 105255

Eine Möglichkeit, auf Dinge in einer anonymen Klasse zu verweisen, ist die Verwendung der final Stichwort:

  public static void main(String[] args) {
    final Object thingIWantToUse = "Hello";

    JButton button = new JButton("Click");
    button.addActionListener(new ActionListener() {
      @Override public void actionPerformed(ActionEvent e) {
        System.out.println(thingIWantToUse);
      }
    });

    JFrame frame = new JFrame();
    frame.setLayout(new FlowLayout());
    frame.add(button);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
  }

Alternativ können Sie auch auf Mitglieder (Variablen oder Methoden) eines umschließenden Typs zugreifen:

public class ActionListenerDemo2 {
  private final JFrame frame = new JFrame();
  private Object thingIWantToUse = "Hello";

  public ActionListenerDemo2() {
    JButton button = new JButton("Click");
    button.addActionListener(new ActionListener() {
      @Override public void actionPerformed(ActionEvent e) {
        thingIWantToUse = "Goodbye";
        System.out.println(thingIWantToUse);
      }
    });
    frame.setLayout(new FlowLayout());
    frame.add(button);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
  }

  public static void main(String[] args) {
    new ActionListenerDemo2().frame.setVisible(true);
  }
}

0 Stimmen

Die zweite Option, die Sie beschreiben, verstehe ich nicht ganz. Wie ist es möglich, auf die Methoden eines umschließenden Typs zuzugreifen?

0 Stimmen

Wenn Sie eine Methode hinzugefügt haben doFoo() a AnctionListenerDemo2 dann könnten Sie es von innen aufrufen actionPerformed . actionPerformed gehört zu der anonymen Implementierung der Schnittstelle der inneren Klasse ActionListener . Einführung in verschachtelte Klassen hier: java.sun.com/docs/books/tutorial/java/javaOO/nested.html

3voto

DarkAngel Punkte 31

Ich hatte das gleiche Problem wie Sie, und so habe ich es gelöst.

Sie können Ihr Objekt entweder final machen (final CastleCrash sim = new CastleCrash();), aber das wollte ich nicht tun, oder Sie können so etwas wie eine Setter-Methode erstellen, um die Methode in Ihrer anderen Klasse auszuführen:

Mein Code für die Listener-Klasse:

button1a.addActionListener(new ActionListener()
{

    public void actionPerformed (ActionEvent event)
    {
    //How to make this work ?
    //Like this:
    runCC();
    }
});

public void runCC()
{
    CastleCrash sim = new CastleCrash();
    sim.runCastleCrash();
}

Mein Code für die andere Klasse:

public void runCastleCrash()
{   
    System.out.println("Castle Crash is beginning...");
    //Other method parts here to be added
}

Ich hoffe, dies ist hilfreich, viel Glück! :)

1voto

Boris Terzic Punkte 10608

McDowell antwortet bereits praktisch mit guten Beispielen, wie man auf Variablen von Ereignis-Listenern (oder anonymen inneren Klassen im Allgemeinen) zugreifen kann. Es gibt jedoch eine allgemeinere Sun-Ressource über Event Listeners in Swing die kanonisch ist, und einen guten Überblick über alle Vorbehalte, die beim Schreiben zu beachten sind.

0voto

Alex Stoddard Punkte 8149

Irgendwie brauchen Sie einen Verweis auf Ihr CastleCrash-Objekt, das von Ihrem actionListener aufgerufen werden kann.

Sie möchten wahrscheinlich JFrame oder was auch immer Ihre JButton enthält, so dass es sowohl Ihre Hauptmethode als auch eine CastleCrash-Eigenschaft hat, die dann von Ihrer anonymen inneren Klasse Actionlistener referenziert werden kann, unterordnen.

ABER - seien Sie vorsichtig, es sieht so aus, als ob Sie eine lang laufende Methode aus dem GUI-Ereignis-Thread heraus aufrufen (wo der Action-Listener aufgerufen wird). Dies ist in der Regel eine schlechte Idee, Sie werden Ihre GUI Fall zu unempfindlich werden.

Ver http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html insbesondere den Abschnitt über die SwingWorker-Klasse, um Ideen zu erhalten, wie dieses Problem vermieden werden kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X