2009-02-24 7 views
5

Supposons que j'ai ceci:Appeler cela de l'intérieur d'un imbriqué Java ActionListener

class external { 
    JFrame myFrame; 
    ... 

    class internal implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      ... 
      myFrame.setContentPane(this.createContentPane()); 
     } 
    } 
    ... 
} 

createContentPane retourne un conteneur. Maintenant, si je faisais ce code en dehors du ActionListener cela fonctionnerait, parce que j'aurais accès à ceci. Mais, à l'intérieur, je ne le fais pas. J'ai accès à myFrame, ce qui est ce qui va être mis à jour avec le contenu de la méthode, mais ce n'est pas suffisant pour faire ce que je veux, à moins que je ne puisse en obtenir un.

J'ai également besoin d'informations d'autres variables d'instance pour utiliser createContentPane(), donc je ne suis pas sûr de pouvoir le faire static.

Répondre

9

Vous pouvez:

myFrame.setContentPane(createContentPane()); 

ou

myFrame.setContentPane(external.this.createContentPane()); 

Par Ainsi, dans les classes Java, la première lettre est généralement en majuscule. Votre code sera toujours compilé et exécuté si vous ne le nommez pas comme ça, mais en suivant les conventions de codage, vous serez capable de lire d'autres codes, et beaucoup plus important d'autres pourront lire votre code.

Ce serait donc un meilleur style:

class External { 
    JFrame myFrame; 
    ... 

     class Internal implements ActionListener { 
      public void actionPerformed(ActionEvent e) { 
       ... 
       myFrame.setContentPane(createContentPane()); 
       //Or myFrame.setContentPane(External.this.createContentPane()); 
      } 
     } 
    ... 
} 

Java Code conventions

+0

Je suis content d'avoir trouvé ça, juste ce dont j'avais besoin (pour la 400ème fois). Je suis un peu tenté d'ajuster la question et cette réponse pour ne pas mentionner la lettre majuscule, car c'est juste déroutant et non pertinent ... mais je ne le ferai pas. Merci +1 –

1

Vous ne savez pas exactement ce que vous obtenez, mais une classe interne a accès à tous les membres de sa classe englobante. Pour accéder à la « ce » pointeur de la classe englobante (par exemple, pour passer à d'autres méthodes) utiliser:

someMethod(External.this); 

Dans votre exemple, vous compliquer réellement en utilisant « ce ». Voici les deux options qui fonctionnent:

myFrame.setContentPane(createContentPane()); 

ou:

myFrame.setContentPane(External.this.createContentPane()); 

Notez que vous accédez déjà myFrame de la même manière.

+0

Argh, me battre de 8 secondes; -) +1 –

+0

c'est les pauses :) merci. –

2

external.this vous donnera accès à l'instance de la classe englobante, si c'est ce que vous voulez ...

0

D'abord, vous devez étendre JFrame dans votre classe externe comme celui-ci

class External extends JFrame { 
..... 
..... 
}