Java: Utilisation d'un ActionListener pour appeler une fonction dans une autre classe sur un objet de cette classe

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

Question

En fait ce que je veux faire est d'obtenir un bouton de démarrage pour lancer une méthode en cours d'exécution dans une autre classe et agissant sur un autre objet.

Mon code pour l'auditeur:

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

Mon code pour l'autre classe:

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

et

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

Je reçois le sentiment que cela ne peut pas être trop dur, mais je me manque un morceau.

Était-ce utile?

La solution

Une façon de référencer les choses dans une classe anonyme utilise le mot-clé final:

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

Vous pouvez accéder aux membres (variables ou méthodes) d'un type englobante:

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

Autres conseils

J'ai eu le même problème que vous et voici comment je l'ai résolu.

Vous pouvez rendre votre finale d'objet (sim finale CastleCrash = new CastleCrash ();), mais je ne voulais pas le faire, ou vous pouvez faire quelque chose comme une méthode setter pour exécuter la méthode dans l'autre classe:

Mon code pour la classe d'auditeur:

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

Mon code pour l'autre classe:

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

Espérons que cela est utile, bonne chance! :)

McDowell répond déjà pratiquement avec de bons exemples sur la façon d'accéder aux variables des auditeurs d'événements (ou classes internes anonymes en général). Il y a cependant une ressource Sun plus générale sur les écouteurs d'événement Swing qui est canonique et un bon aperçu de toutes les mises en garde à prendre en compte lors de leur écriture.

D'une certaine façon vous avez besoin d'une référence à votre objet CastleCrash disponible pour appeler à partir de votre actionListener.

Vous voulez probablement sous-classe JFrame, ou contenant tout ce qui est votre DButton telle qu'elle a votre votre mode principal et une propriété CastleCrash qui peut ensuite être référencé à partir de votre classe interne anonyme actionListener.

- faites attention, vous regardez comme vous appelez ce sera une longue méthode de fonctionnement à partir du thread d'événement GUI (où l'auditeur d'action appelé). Ceci est généralement une mauvaise idée, vous le cas où votre interface graphique pour ne pas répondre.

Voir http://java.sun.com/ produits / JFC / tsc / articles / fils / threads1.html en particulier le bit de la classe SwingWorker des idées sur la façon d'éviter ce problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top