7
votes

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

Fondamentalement ce que je veux faire, c'est d'obtenir un bouton de démarrage pour lancer une méthode exécutée dans une autre classe et agissant sur un autre objet.

Mon code pour l'auditeur: P>

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


3 commentaires

Quelles erreurs obtenez-vous? Est-ce que la variable sim est-elle dans la portée lorsque vous essayez d'ajouter l'ActionListener au bouton? Un piège typique est que les variables doivent être définitives pour être accessibles à partir d'une classe interne anonyme telle que votre actelistener.


Je reçois l'erreur: Exception dans le fil "Main" Java.Lang.Error: problème de compilation non résolue: SIM ne peut pas être résolu, je pense que vous avez raison de dire que c'est un problème avec SIM ne pas être dans la portée, mais je ne peux pas comprendre Comment faire en finale ....


Voir la réponse de McDowell, c'est ce que je répondrais.


4 Réponses :


0
votes

D'une manière ou d'une autre vous avez besoin d'une référence à votre objet CastlecRash disponible pour appeler de votre actionListener.

Vous voulez probablement la sous-classement JFRAME, ou tout ce qui contient votre JButton de manière à ce que votre méthode principale et une propriété CastlecRash puisse ensuite être référencée à partir de votre action de classe interne anonyme.

Mais - soyez prudent, vous ressemblez que vous appelez ce qui sera une méthode de course longue du fil de l'événement GUI (où l'auditeur d'action sera appelé). C'est généralement une mauvaise idée, vous allez casser votre interface graphique de devenir insensible.

voir http://java.sun.com/ Produits / JFC / TSC / Articles / Fils / Threads1.HTML Surtout le bit sur la classe SwingWorker pour des idées sur la façon d'éviter ce problème.


0 commentaires

5
votes

Un moyen de faire référence à des choses dans une classe anonyme consiste à utiliser le mot-clé code> final > xxx pré>

Alternativement, vous pouvez accéder aux membres (variables ou méthodes) d'une enfermante Type: P>

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


2 commentaires

Je ne comprends pas tout à fait la deuxième option que vous décrivez. Comment est-il possible d'accéder aux méthodes d'un type joint?


Si vous avez ajouté une méthode dofoo () à anonlistenerdemo2 , vous pouvez l'appeler à partir de l'intérieur acteperformé . ActionperFormé appartient à la classe interne anonyme Implémentation de l'interface ActionListener . Intro des classes imbriquées ici: Java.sun.com/docs/ Livres / Tutoriel / Java / Javaoo / Netd.html



1
votes

McDowell répond déjà pratiquement avec de bons exemples sur la manière d'accéder aux variables des auditeurs d'événements (ou de classes intérieures anonymes en général). Il y a cependant Une ressource Sun plus générale sur les auditeurs d'événements dans Swing < / a> qui est canonique et un bon aperçu de toutes les mises en garde à prendre en compte lors de l'écriture.


0 commentaires

2
votes

J'ai eu le même problème comme vous et c'est comme ça que je l'ai résolu.

Vous pouvez soit faire votre objet final (Final Castlecrash sim = New Castlecrash ();), mais je ne voulais pas faire que, ou vous pouvez faire quelque chose comme une méthode de setter pour exécuter la méthode de votre autre classe: p>

Mon code pour la classe d'écoute: p> xxx pré>

My Code pour l'autre classe: P>

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


0 commentaires