2010-11-18 26 views
2

Y at-il un moyen pour moi de passer des variables dans un actionlistener sans les appeler comme final? Je voudrais utiliser ces deux points à l'intérieur d'une manière temporisée ... J'ai essayé Thread.sleep() mais pour une raison quelconque, il ne s'accorde pas bien avec le reste du programme. C'est le format que j'aimerais vraiment utiliser, mais je suis conscient qu'il pourrait être impossible de le faire fonctionner. Je suis ouvert à tous et à tous les conseils. Merci!Passer des variables dans un Java ActionListener?

(Je suis désolé si cela est une question stupide, j'ai cherché une réponse mais ne peux pas trouver un.)

public void timedMain(Point current, Point wanted){ 
      ActionListener taskPerformer = new ActionListener(){ 
       public void actionPerformed(ActionEvent evt){ 
        System.out.println(wanted+" "+current);}}; 
        actiontimer = new Timer(delay, taskPerformer); 
        actiontimer.start();} 

Répondre

4

Vous pouvez le faire, ce qui évite de déclarer les paramètres comme définitifs.

public void timedMain(Point current, Point wanted) { 
     final Point c = current; 
     final Point w = wanted; 
     ActionListener taskPerformer = new ActionListener(){ 
      public void actionPerformed(ActionEvent evt){ 
       System.out.println(w + " " + c);}}; 
       actiontimer = new Timer(delay, taskPerformer); 
       actiontimer.start();} 

Ou vous pouvez changer les types de current et wanted afin qu'ils étaient mutable Point détenteurs, et ont l'aspect de la méthode actionPerformed aux valeurs actuelles dans les supports.

Mais il est impossible de déclarer la classe interne afin qu'elle puisse voir les modifications apportées à une variable dans une étendue de méthode englobante ... si c'est ce que vous essayez de faire.

+0

Cela semble fonctionner correctement pour ce que j'ai l'intention d'utiliser cet extrait de code. Merci pour la réponse rapide, vous êtes un sauveteur. – whuff739

1

Vous pouvez faire quelques petites choses

  • vous pouvez promouvoir l'auditeur d'action anonyme à un (statique privé) classe interne, et de transmettre les arguments au constructeur

  • vous pouvez définir une fonction qui a construit une action anonyme li Stener, plutôt que inline dans votre code, et faire les paramètres à cette fonction finale

Quel est le problème avec les marquant juste « finale », si?

+0

Merci pour la réponse rapide ... Je n'ai pas regardé les auditeurs d'action anonymes, je regarde ça en ce moment. – whuff739

+0

Votre 'taskPerformer' est un écouteur d'action anonyme. C'est-à-dire, il y a une nouvelle sous-classe de ActionListner définie quand vous allez 'new ActionListner() {...} et que cette sous-classe n'a pas de nom (code source). –