Newsgroup: it.comp.java
Titolo: Problemi con gli eventi

Ho un problema di visibilita' di variabili.
Ho la necessita' di istanziare una classe (fuori dai metodi) e   di doverne
assegnare le variabili di istanza all'interno del metodo di ascolto di un
event su un component AWT.
Infatti le variabili della classe le acquisiro' tramite lettura di
TextFields , Choice o Button
ma non posso istanziare la classe all'interno ad es. di ActionListener
perche' i componenti da leggere e le variabili da assegnare saranno in
numero superiore ad 1 e quindi poi mi troverei ad istanziare la stessa
classe piu' volte.
Mi spiego con un Es:
class Animale{
        int zampe;
        int corna;
}
class Prova extends Applet implements ActionListener{
public void init(){
    Animale Pippo = new Animale();
    TextField ZAMPE=new TextField(2); // creo un button
ZAMPE.addKeyListener(           
     new KeyAdapter(){                   // INNER CLASS
         public int keyTyped(KeyEvent e){
                /*vorrei che fosse visibile in questo modo
                ma non riconosce Pippo la nuova istanza della classe animale*/
                    Pippo.zampe=valore di TextField;  
          }
        });
 
TextField CORNA=new TextField(2); // creo un button
CORNA.addKeyListener(           
     new KeyAdapter(){                   // INNER CLASS
         public int keyTyped(KeyEvent e){
                /*vorrei che fosse visibile in questo modo
                ma non riconosce Pippo la nuova istanza della classe animale*/
                    Pippo.corna=valore di TextField;  
          }
        });
                                // oppure
        ZAMPE.addActionListener(this);
        CORNA.addActionListener(this);
  }
    public void actionPerformed(ActionEvent evento) 
    {
                /*oppure che fosse visibile in questo modo
                ma non riconosce Pippo la nuova istanza della classe animale*/
                    Pippo.zampe=valore del textfield ZAMPE;  
 
 
  Pippo.corna=valore del textfield  CORNA;
                /*non so se e' una cosa possibile ma potrebbe
                    essermi d'aiuto  anche la possibilita'
                    che il metodo ActionPerformed possa
                       essere ridefinito
                 con una variabile di ritorno anziche' void*/
    }
}
(nel mio caso reale non posso istanziare una classe in ActionPerformed
perche' non saprei neanche che classe istanziare, posso appurarlo solo al di
fuori)
Grazie.

                    Pippo.zampe=valore di TextField;  
Ho l'impressione che il tuo unico problema sia nel non
avere definito final la variabile locale Pippo.
Come penso tu sappia, visto che e` fondamentale per
il concetto stesso delle inner classes, una inner class
si "porta dietro", implicitamente, i riferimenti alle variabili
locali allo scope in cui e` definita, ma SOLO quelli final
(esaminando il modello concettuale di implementazione
delle inner classes, e gli analoghi modelli di "closure"
lessicali in altri linguaggi come ad es. Scheme o Icon,
dovrebbero essere chiari i perche` di questo vincolo).
Qui, la variabile locale Pippo NON e` final (e` per pura
distrazione, o _veramente_ hai bisogno di far si` che
la stessa Pippo cambi in modo da fare riferimento a 
diversi oggetti di tipo Animale in diversi momenti...?),
e quindi naturalmente non e` accessibile alle inner
classes.  Non puoi strutturare il tuo codice in modo che
Pippo *SIA* final...?
Cosi` come, in C o C++, si dovrebbero sempre dire
"const" i bersagli di puntatori o reference a meno che
non abbiano specifiche esigenze di cangiabilita` (o di
estrema flessibilita` di futuri cambiamenti), cosi`, in 
Java, andrebbe sistematicamente usato "final" per cio`
che si sa che non ci sara` bisogno di cambiare (almeno
tutte le volte che sono in gioco inner classes, o che puo`
essere importante la eventuale ottimizzazione che il
compilatore Java puo` essere in grado di fare!), salvo,
anche qui, che non sia richiesta estrema flessibilita`
di futuri cambiamenti (se poi sono indispensabili, SIA
l'uso da inner class, SIA la flessibilita` piu` estrema,
allora e` quando si comincia coi trucchi piu` sporchi:-).
Alex