Java: eine Action Verwendung von dieser Klasse auf ein Objekt eine Funktion in einer anderen Klasse nennen

StackOverflow https://stackoverflow.com/questions/1346978

Frage

Im Grunde, was ich tun möchte, ist eine Starttaste erhalten, ein Verfahren läuft in einer anderen Klasse zu initiieren und auf ein anderes Objekt handeln.

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

und

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

Ich habe das Gefühl, das kann nicht zu hart sein, aber ich bin ein Stück fehlt.

War es hilfreich?

Lösung

Ein Weg, um Referenz Dinge in einer anonymen Klasse wird mit dem 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 Elemente (Variablen oder Methoden) eine umschließenden Art zuzugreifen:

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

Andere Tipps

Ich habe das gleiche Problem wie du gehabt, und das ist, wie ich es gelöst.

Sie können entweder das Objekt endgültig (final CastleCrash sim = new CastleCrash ();) machen, aber ich wollte nicht, das zu tun, oder Sie können so etwas wie eine Setter-Methode machen das Verfahren in der anderen Klasse zu laufen:

Mein Code für den Hörer 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
}

Hope Dies ist hilfreich, viel Glück! :)

McDowell Antworten bereits praktisch mit guten Beispielen, wie man Zugang Variablen von Ereignis-Listener (oder anonymen inneren Klassen im Allgemeinen). Es gibt jedoch eine allgemeinere Sun Ressource auf Ereignis-Listener in Swing das heißt kanonische und eine gute Übersicht über alle Einsprüche zu berücksichtigen, wenn sie zu schreiben.

Irgendwie müssen Sie einen Verweis auf Ihr CastleCrash Objekt von Ihrer Action nennen.

Sie wollen wahrscheinlich JFrame Unterklasse, oder was auch immer ist mit Ihrem JButton so dass es Ihre beiden Hauptverfahren und eine CastleCrash Eigenschaft, die dann von Ihrer anonymen inneren Klasse referenziert werden kann Action.

ABER - Vorsicht, Sie sehen aus wie Sie anrufen, was eine lange Lauf Methode innerhalb der GUI Event Thread sein wird (wo die Aktion Hörer genannt wird). Dies ist im Allgemeinen eine schlechte Idee, Sie wenn Ihr GUI nicht mehr reagiert.

Siehe http://java.sun.com/ Produkte / JFC / tsc / articles / Themen / threads1.html insbesondere das Bit auf Swingworker Klasse für Ideen, wie dieses Problem zu vermeiden.

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