Newsgroup: it.comp.java
Titolo: Richiamare un JTextField

Ciao a tutti,
in una JDialog vorrei poter richiamare un JTextField utilizzando un
ciclo FOR per automatizzare le operazioni di lettura e scrittura sul
database.
Ho risolto utilizzando questo codice
public Component getComponentByName(String nameFld) {
        for (Component c : this.getContentPane().getComponents()) {
            String name = c.getName();
            if (c != null && name.compareToIgnoreCase(nameFld)==0) {
                return c;
            }
        }
        return null;
    }
il problema è che devo definire per ogni JTextField il nome usando il
metodo setName().
Qualcuno conosce un'alternativa più veloce? Visto che il mio
JTextField è già identificato attraverso un nome variabile, per
esempio this.fld_cognome, vorrei evitare di scrivere nuovamente
this.fld_cognome.setName("fld_cognome");
per poter poi richiamare il JTextField utilizzando
((JTextField) getComponentByName("fld_cognome")).setText("Rossi");
Qualche suggerimento ???
Grazie
Biagio

 Qualche suggerimento ???
Se l'hai gi� come attributo di una classe, perch� devi cercarlo per nome 
fra i component del container?
Basta che usi direttamente:
this.fld_cognome.setText("Rossi");
Ciao
   Lucio
-- 
Lucio Benfante
JUG Padova           
http://www.parancoe.org
 ...have a look at it!
www.jugpadova.it
 
http://www.jugevents.org


Forse non sono stato chiaro. Mi spiego meglio.
In una JDialog di immissione dati, per evitare di scrivere parecchio
codice e anche di fare degli errori di scrittura, divido la logica
esecutiva in due classi.
La prima classe mi serve per inserire tutto il codice standard
costituito da metodi che eseguono le operazioni ripetitive e comuni a
tutte le JDialog.
Nella seconda classe, invece, inserisco tutti i componenti
(JTextField, JComboBox, etc, etc).
La seconda classe viene ereditata dalla prima così ottendo una classe
completa di tutto. Ogni modifica o miglioria alla prima classe si
ripercuote automaticamente in tutte le classi che sono state ereditate
da questa.
Nella prima classe non conosco i nomi delle variabili della seconda
classe e per questo definisco un vettore vuoto che ospiterà i nome
delle viariabili.
Nella seconda classe popolo il vettore con i nomi delle variabili
(JTextField).
Nella prima classe definisco un metodo che con un semplice ciclo for
popola le JTextField processando gli elementi del vettore.
Per rendere questo metodo standard è ovvio che devo poter richiamare
le singole JTextField con un riferimento che punta alla viariabile,
per esempio per popolarle da un rs faccio così:
for (int i = 0; i < listaField.size(); i++) {
    ((JTextField) getComponentByName(listaField[i[)).setText
(rs.getString(listaField[i[));
}
Volevo trovare un altro metodo più elegante per lavorare meno e magari
per rendere l'esecuzione più veloce.

 Biagio
Immagino che il metodo  getComponentByName ed anche il JTextField 
appartengano ad un'altra classe, altrimenti la soluzione sarebbe banale. 
In tal caso il massimo che tu possa fare (con i dovuti try/catch):
public <V extends Component >V getComponentByName (
	String nameFld, Class<V> type) {
   Field campo = this.getClass().getDeclaredField(nameFld);
   if (campo == null &&
       !type.isAsignableFrom(campo.getType()) return null;
   Object component = campo.get(oggetto);
   for (Component c : this.getContentPane().getComponents())
     if (c != null &&
         type.isAsignableFrom(c.getClass()) &&
         c.equals(component))
       return c;
   return null;
}
e per chiamarlo:
JTextField fld = getComponentByName ("fld_cognome", JTextField.class);
if (fld != null) fld.setText("Rossi");

 > JTextField gi identificato attraverso un nome variabile, per

Mi da errore a questa riga
Object component = campo.get(oggetto);
Certo che se dovesse funzionare, mi risparmio un sacco di
JTextField.setName("bla bla bla");
Sempre gentilissimo

 Object component = campo.get(oggetto);
Secondo la gerarchia delle che hai indicato qualche post fa, se il 
metodo lo stai definendo nella classe "padre" dovrebbe bastare:
Object component = campo.get(this);
Dai cmq un'occhiata alla Reflection in Java per capirne il funzionamento 
  ed adattarlo alle tue necessita' (anche future)


Caspita, questo linguaggio non finisce di stupirmi. Ogni giorno ne
scopro una nuova.
Ho dato un'occhiata alla Reflection ed ho capito che permette di
trattare oggetti a run-time. Per un principiante come me è un po'
prematuro ma proverò a fare qualche prova.
Grazie

 wrote:

Caspita, questo linguaggio non finisce di stupirmi. Ogni giorno ne
