2009-02-24 18 views
5

Załóżmy, że mam to:Wywołanie tego od wewnątrz zagnieżdżone Java ActionListener

class external { 
    JFrame myFrame; 
    ... 

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

createContentPane zwraca pojemniku. Teraz, jeśli robiłbym ten kod poza ActionListener, zadziałałby, ponieważ miałbym do niego dostęp. Ale w środku nie. Mam dostęp do myFrame, która jest aktualizowana zawartością tej metody, ale to nie wystarczy, aby zrobić to, co chcę, chyba że mogę to zrobić z tego.

Potrzebuję również informacji z innych zmiennych instancji do korzystania z createContentPane(), więc nie jestem pewien, czy mogę to zrobić static.

Odpowiedz

9

Można:

myFrame.setContentPane(createContentPane()); 

lub

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

Przez sposób, w klasach Java pierwsza litera jest zwykle wielka. Twój kod będzie nadal kompilowany i uruchamiany, jeśli nie nazwiesz go w ten sposób, ale przestrzegając konwencji kodowania będziesz mógł odczytać kod inny, a znacznie ważniejsze inne będą w stanie odczytać twój kod.

Więc byłby to lepszy styl:

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

Cieszę się, że znalazłem to, właśnie to, czego potrzebowałem (po raz 400.). Mam ochotę skorygować pytanie, a ta odpowiedź nie wspomina o wielkiej litery, ponieważ jest to po prostu mylące i nieistotne ... ale nie będę. Dziękujemy +1 –

1

Nie wiem, do czego zmierzasz, ale klasa wewnętrzna ma dostęp do wszystkich członków swojej klasy. Aby uzyskać dostęp do „tego” wskaźnika klasy okalającego (na przykład przejść do innych metod) używać:

someMethod(External.this); 

w przykładzie, jesteś rzeczywiście komplikowania go za pomocą „to”. Tutaj są dwie opcje, które będą działać:

myFrame.setContentPane(createContentPane()); 

lub:

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

Pamiętaj, że jesteś już dostępu myFrame w ten sam sposób.

+0

argh, pokazał mi przez 8 sekund; -) +1 –

+0

ich przerwy :) dzięki. –

2

external.this da Ci dostęp do instancji klasy okalającego, jeśli to, co chcesz ...

0

Najpierw trzeba rozszerzyć JFrame w swojej zewnętrznej klasy jak ten

class External extends JFrame { 
..... 
..... 
} 
Powiązane problemy