Entra

View Full Version : [Java] setText di un JTextField privato


stefandre_nicari
07-03-2010, 17:18
Come faccio a cambiare il testo di un JTextField dichiarato private (da un'altra classe ovviamente)?

WarDuck
07-03-2010, 17:40
Non puoi a meno che non esponi un metodo per farlo nella classe che ti interessa.

PGI-Bis
08-03-2010, 12:42
Puoi. Devi usare un'invocazione riflessiva. Prima di accedere al membro lo dichiari accessibile (setAccessible(true)). E' una funzione soggetta a restrizioni di sicurezza.

stefandre_nicari
08-03-2010, 13:06
Mi fai un esempio di codice per favore? Metti che il Jbutton si chiama "jButton1"

WarDuck
08-03-2010, 13:12
Puoi. Devi usare un'invocazione riflessiva. Prima di accedere al membro lo dichiari accessibile (setAccessible(true)). E' una funzione soggetta a restrizioni di sicurezza.

Non la sapevo questa cosa... ma come funziona esattamente? Vengono modificati effettivamente i diritti di accesso (da private a public, non credo) oppure viene usato un pattern particolare per modificare questa cosa a run time?

PGI-Bis
08-03-2010, 13:13
Vado a memoria:

String testoDaImpostare = "qualcosa";
Class<?> classe = NomeClasseColCampo.class
Object x = istanzaDiClasse;
Field campo = classe.getDeclaredField("jButton1");
try {
campo.setAccessible(true);
campo.set(istanzaDiClasse, testoDaImpostare);
} catch(SecurityException ex) {
//log: le impostazioni di sicurezza non consentono l'accesso a membri privati.
}

PGI-Bis
08-03-2010, 13:15
Ps.: non che sia una bella cosa da fare, normalmente se un membro è privato c'è il suo bel motivo. Ma se si è proprio alle strette...

stefandre_nicari
08-03-2010, 13:29
Molto interessante sta cosa... Per quello che devo fare è uno spreco di codice...tanto vale dichiararli public...ma mi tornerà utile... Grazie mille!

PGI-Bis
08-03-2010, 13:43
Campo, pubblico? Brutto brutto brutto. Usa sempre un accessore (getter in javese).

DevilMalak
08-03-2010, 13:48
Molto interessante sta cosa... Per quello che devo fare è uno spreco di codice...tanto vale dichiararli public...ma mi tornerà utile... Grazie mille!

Appunto se sei tu che stai scrivendo la classe contenente il JTextField perche` non crei un metodo per modificare il testo di quel campo nella tua classe?

banryu79
08-03-2010, 13:49
Non la sapevo questa cosa... ma come funziona esattamente? Vengono modificati effettivamente i diritti di accesso (da private a public, non credo) oppure viene usato un pattern particolare per modificare questa cosa a run time?
Come ha spiegato PGI.
Considera che questa "tecnica" si usa (ad esempio) nello Unit Test, per testare i metodi privati di una classe dalla classe di test [c'è un topic relativo di qualche giorno fa al proposito].

Usa sempre un accessore (getter in javese).

Senza offesa, ma il termine "accessore" è un'italianizzazione orrenda :cry:

PGI-Bis
08-03-2010, 13:58
Senza offesa, ma il termine "accessore" è un'italianizzazione orrenda :cry:

E' perchè non hai mai sentito "strumentizzare" :D

banryu79
08-03-2010, 13:59
E' perchè non hai mai sentito "strumentizzare" :D
Non ci credo :O (Oddio!)

WarDuck
08-03-2010, 15:18
In effetti non mi sembra una pratica di tutti i giorni, meglio un campo private e dichiarare i metodi di accesso (accessors :D) getter e setter.