Assunto questo oggetto:
JFormattedTextField fornitoreTextField = new JFormattedTextField();
....
this.fornitoreTextField.setFormatterFactory(new AbstractFormatterFactory() {
@Override
public AbstractFormatter getFormatter(JFormattedTextField tf) {
return new AbstractFormatter() {
@Override
// Questo metodo viene richiamato quando scrivete qualche cosa
// dentro al campo e poi cambiate il focus con il tab o date l'invio.
// Lo String che viene passato e' il testo che digitate...
public Object stringToValue(String fornitore) throws ParseException {
// Decodifico il fornitore andando sul db;
// il risultato lo setto su
// this.fornitoreTextField.setValue(ilMioOggettoTrovatoDalDb);
// Se non riesco a decodificarlo potete sollevare una ParseException;
// questo __CANCELLA__ quanto digitato nel campo,
//in modo che l'utente s'accorga dell'errore.
Fornitore fornitore = decodificaFornitore(fornitore);
setValue(fornitore);
return fornitore;
}
@Override
// Questo metodo viene invocato quando si chiama il setValue()
// sull'oggetto JFormattedTextField
// È quello che ha la responsabilità di mostrare le scritte
//dentro al widget "decodificando" un oggetto.
public String valueToString(Object value) throws ParseException {
// Controllo che l'oggetto che mi arriva sia quello che mi
aspetto..
// Occhio alle ClassCastException:
// sono __SEMPRE__ in agguato! :)
if (value instanceof Fornitore) {
Fornitore fornitore = (Fornitore) value;
// Dell'oggetto mostro solo quello che mi interessa
return fornitore.getRagSociale().trim();
}
return null;
}};
}});
}
Un secondo aspetto importante di questo approccio è, banalmente, quello di poter utilizzare il JFormattedTextField
come "contenitore" degli oggetti decodificati.
In questo modo nel codice applicativo posso accedervi sempre usando il getValue()
-con opportuno typecast- anziche' dovervi settare, magari, un field privato di classe per tenere la stessa informazione.