Newsgroup: it.comp.java
Titolo: Come (o dove) la dichiaro?

Salve a tutti,
ho postato questa domanda qualche tempo fa e ho anche cercato un bel 
po' in rete ma niente da fare. Spero possiate aiutarmi, è sicuramente 
una cosa semplice, espongo il problema con un esempio
public class Classe
{
	public static main void(String[] args)
	{
		int variabile=0;
		JButton pulsante=new JButton("x");
		...
			class Ricevitore implements ActionListener
			{
				public void ActionPerformed(ActionEvent e)
				{
					variabile=10; <==
				}
			}
			Ricevitore x=new Ricevitore();
			pulsante.addActionListener(x);
		...
	}
}
Ecco il problema: questo che ho fatto (aggiornare variabile) non si può 
fare, visto che dice che Ricevitore può accedere solo a variabili final 
(che poi dice che non si può aggiornare), come devo fare dunque per 
poter aggiornare questa variabile?
Grazie in anticipo!
-- 
R@f'84

Dichiara la variabile fuori dal "main", mettila come static (e magari anche
come public, a seconda di come hai organizzato i package, poi nella Action
la richiami come
Classe.variabile=10;
E' meglio, ovviamente, avere un metodo statico (in "Classe") che imposta la
variabile che rimane locale a "Classe".
Spero sia questa la soluzione che cerchi!
Alex.
-- 
___________________________________________________________
a p bertolini
(
www.webwarrior.org
)

 Spero sia questa la soluzione che cerchi!
Grazie mille!!!
infatti lo sapevo che era una cosa semplice, non ho capito perchè l'ho 
dovuta dichiarare static.
Ah, un'altra cosa...questo funziona anche con oggetti? Nel mio caso ad 
esempio devo modificare un valore di un oggetto di tipo File, lo 
dichiaro allo stesso modo?
-- 
R@f'84

 dichiaro allo stesso modo?
Yess! Nella classe dichiarerai static File myFile=new File() (o quel che č)


 poter aggiornare questa variabile?
Benchè dichiararla static, come già suggerito, funzioni, non è questo il
modo di risolvere il problema, sia per gli effetti collaterali che ti hanno
già spiegato, sia perchè static non è pensato per il tuo problema.
Tuttavia, la soluzione è ancora più semplice: dichiarare come final vuoto la
tua variabile primitiva intera da modificare, se hai bisogno di impostare
il valore una sola volta, o dichiararla di tipo Integer (o il rispettivo
tipo wrapper a seconda della primitiva), in modo da poterne modificare il
valore tutte le volte che si vuole.
Spero di essere stato chiaro.
Un saluto,
Sergio B. 
-- 
Ideatore, sviluppatore e amministratore del progetto QuickNote, su
http://quicknote.sourceforge.net/

 Teoricamente se pera.peso=10 allora mela.peso==10
Si si ok, questo lo sapevo e sapevo anche che una delle prime cose dette 
sulle variabili statiche era quella di usarle il meno possibile! e che 
spesso possono causare problemi.
Perciò ho posto quella domanda, era più per dire: come mai in questo 
caso ci vuole una variabile static?
-- 
R@f'84

 Sergio B. 
Quindi la integer si può modificare dalla classe interna?
-- 
R@f'84

 caso ci vuole una variabile static?
Perché altrimenti dovresti passare al gestore dell'evento (o in generale
alla classe cui appartiene) il riferimento all'oggetto il cui valore vuoi
impostare.


 Quindi la integer si può modificare dalla classe interna?
Rettifico: non la uso da molto tempo e pensavo che la classe Integer nativa
avesse un metodo setter per il valore intero che rappresenta, ma non lo ha.
Scusa se ti ho messo un attimo fuori strada.
Puoi comunque risolvere il problema wrappando il valore intero in una tua
classe:
public class SimpleInteger
{
        private int i;
        public SimpleInteger()
        {}
        public SimpleInteger(int value)
        { i=value; }
        public void setValue(int value)
        { i=value; }
        public int getValue()
        { return i; }
}
A questo punto potrai modificare il tuo intero SimpleInteger quante volte
vorrai tramite il metodo setter.
Qualche riga di codice in più per una soluzione tuttavia molto più sicura ed
elegante.


 Un saluto,
Grazie
Però mi sembra strano che non ci sia una soluzione più "veloce"! Se 
allora in un programma devo gestire variabili e oggetti di vario tipo da 
modificare alla pressione di un pulsante o la selezione di un menù mi 
dovrò scrivere classi del genere per ognuno di essi?
-- 
R@f'84
^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^
Comitato I fan per eccellenza di Dawson ®
^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^

 impostare.
Riferimento??
Ma è possibile fare una cosa del genere in java?
-- 
R@f'84

 dovrò scrivere classi del genere per ognuno di essi?
Attenzione: il tuo problema era quello di modificare una variabile locale, e
la soluzione migliore è quella prima esposta.
Nella maggior parte dei casi, tuttavia, come quello da te sopra citato, le
variabili da modificare saranno di istanza, non più locali: in questo caso
non sarà necessario renderle final.
Per intenderci, una cosa del genere è perfettamente lecita:
class SomeClass
{
        private int i;
        private SomeObject o;
        // Classe interna ...
                i=10;
                o=new SomeObject();
        // ...
}
Questo, grazie al fatto che le classi interne hanno la capacità di accedere
a variabili e metodi, sia pubblici che privati, della classe contenitrice.
Non è affatto necessario rendere la variabile statica, a meno che non ti
serva una classe interna statica.
Spero di essere stato chiaro.


 Un saluto,
Chiaro si, il problema è che io l'ho provato a fare questo (come prima 
soluzione) perchè pensavo funzionasse e invece no!
Ecco l'errore che mi da dichiarando la mia variabile come variabile 
d'istanza: non-static variable x cannot be referenced from a static 
context
-- 
R@f'84

 context
L'errore č dovuto al fatto che stai referenziando un oggetto all'interno di
un metodo dichiarato static.
Credo sia il momento di postare piů codice, R@f, cosě vediamo il tuo
approccio di design.
Alex



il motivo dell'errore in compilazione è, ovviamente, che la tua classe
interna, sebbene non statica, risiede in un contesto statico, ossia il
main.
A questo punto ti domando: perchè dichiari la tua classe interna all'interno
del main?
Dichiararla all'esterno è più corretto, inoltre risolveresti il tuo problema
secondo quanto detto prima.


, 
sb_touristR...@tin.it
 says...
(cut)
[ot]Sergio guarda che al posto degli spazi io vedo delle A accentate nel 
tuo post
Comunque devo "chiedere scusa" ad entrambi, infatti ho risolto 
stamattina il problema. Ed era proprio il fatto di scrivere tutto il 
codice del mio programma nel main.
E' da poco che mi sto avvicinando al Java (studi universitari) e quindi 
provo in continuazione nuove cose (a volte a caso) e poi mi hanno 
consigliato di non scrivere tutto nel main (in pratica io scrivevo tutto 
il codice del mio programma in un unico metodo, appunto ilmain) e invece 
stamane mi sono fatto le classi separate:
-una che estende JFrame dove costruisco l'interfaccia utente (pulsanti, 
etichette, menu,...classi interne ecc)
-una dove c'è il main che contiene tre righe di codice (creo un oggetto 
della classe di prima e lo mostro).
Credo che così vada meglio ;P
Grazie comunque di aver "perso tempo dietro il mio problema"
-- 
R@f'84