Newsgroup: it.comp.java
Titolo: consiglio "da esperti" per gerarchia classi

Come leggete da titolo vorrei un consiglio da tutti coloro che hanno parecchia dimestichezza con java.
Sto realizzando una mia libreria di oggetti personalizzati, sto quidi creando una gerarchia a seconda del tipo di oggetto , in questo momento mi sto dedicando alle textfield.
ho una classe "madre" astratta 
 
abstract class MyFormattedTextfield extends JFormattedTextField implements FocusListener{
.....
}
 
da cuiderivano altre classi , una ad esempio deve accettare solo i numeri e li deve formattare in decimali
 
public class MyTextFieldDecimal extends MyFormattedTextField {
 
    public MyTextFieldDecimal() {
        setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        DecimalFormatSymbols dfs = new DecimalFormatSymbols();
        dfs.setDecimalSeparator('.');
        DecimalFormat df = new DecimalFormat("0.00",dfs);
        NumberFormatter dformatter = new NumberFormatter(df);
        DefaultFormatterFactory formatter = new    DefaultFormatterFactory(dformatter);
        setFormatterFactory(formatter);
        setValue(new Float(0));
    }
 
 
Ho letto che per far si che la textfield acccetti solo numeri bisogna estendere
PlainDocument sovrascrivere insertString e assegnare tale oggetto Document alla JTextField:
public class Solo Numeri extends PlainDocument {
    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
        if(str!=null && str.matches("[\\d]*"))
            super.insertString(offs, str, a);
    }
}
 
e poi nel programma principale 
MyDecimalTextField tf = new MyDecimalTextField();
tf.setDocument(new NumberDocument());
 
 
Devo dire che questo approccio non mi piace , nel senso che vorrei che questo filtro fosse già integrato nella classe MyDecimalTextField, il fatto è che tale classe extends già un'altra e non posso extendere anche PlainDocument.
Che fare allora ? implementare AbstractDocument o Document ?
Voi che fareste ? la mia nasce dal fatto che vorrei che in una classe ci fossero tutti i controlli per la classe stessa , però forse pur di non dover definire tutti i metodi di AbstractDocument o Document  converrebbe cambiare approccio?
Attendo vostri consigli 
grazie


Tra l'altro ho provato ad aggiungere 
MyDecimalTextField tf = new MyDecimalTextField();
setDocument(new NumberDocument());
all0interno del costruttore della classe MyDecimalFormat e vedo che tutto il contenuto iniziale delle jtextfield viene cancellato....
fatemi luce ...;-)


Fatemi capire, senza offesa per nessuno o questo forum ormai è morto , o non c'è nessuno esperto, o quello che vi chiedo non è mai risolvibile....almeno una risposta per cercare di capire insieme il problema...

 almeno una risposta per cercare di capire insieme il problema...
Normalmente utilizzo le classi per quello che risulta dalla 
documentazione, per cui non mi ritengo un esperto per dare pareri sul 
caso che proponi.
Nella fattispecie, il JFormattedTextField si crea il suo bel formatter 
al primo setValue in base al tipo del valore, per cui io non mi sarei 
mai sognato di intraprendere una strada come quella che hai preso tu. 
Che non significa che sia sbagliata, ne' che sia la mia quella giusta, 
semplicemente mi sono limitato all'uso consigliato dal javadoc.


Ti ringrazio estremamente della risposta, perchè permette di intavolare una discussione e cercare di crescere tecnicamente (almeno per quanto mi riguarda).
Premetto che non sono un conoscitore di tutti i mattoni Java e quindi molti buchi ci sono nelle mie conoscenze...Sono consapevole che il JFormattedTextField si auto formatta una volta che dò il setValue (sai ho fatto delle prove..) quello che mi interessava e che non riesco ad ottenere è questo effetto (e su questo chiedo indicazioni) : vorrei che i caratteri alfabetici venissero riconosciuti e non scritti neanche nella JFormattedTextField, di contro quelli numerici vengono accettati e formattati come stabilito.
Attualmente accade questo i caratteri non validi vengono scritti ma all'abbandonare del focus vengono formattati solo i valori validi inseriti. Se invece applico il DocumentPlain ad una semplice JtextField vengono scritti solo i numeri, mentre i caratteri no (questo va bene) però chiaramente i numeri non verranno formattati come vorrei. 
Da qui mi nasce la crisi...vorrei entrambi gli effetti
Grazie della risposta

 Grazie della risposta
Premetto che non ho capito bene. Il comportamento del 
JFormattedTextField puo' essere regolato in diversi modi, ad esempio col 
metodo setFocusLostBehavior. Per modificare l'edit dei numeri, 
basterebbe impostare le proprietï¿œ corrette nel formatter che ottieni con 
il metodo getFormatter()  o tramite il Format che ottieni tramite
getFormatter().getFormat(), ammesso che ci sia.

 getFormatter().getFormat(), ammesso che ci sia.
 
Grazie ancora per la risposta, scriverò le due classi che ho creato in modo che tu possa vedere l'effetto che ottengo:
 
la prima, per avere un filtraggio dei numeri
 
public class MyNumberControl extends PlainDocument {
    public MyNumberControl(){
 
    }
    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
        Pattern pattern = Pattern.compile("[a-zA-Z]");
        if (!(str!=null && pattern.matcher(str).matches())){
            super.insertString(offs, str, a);
            System.out.println("numero");
        }
        else
            System.out.println("carattere");
    }
}
 
 
la seconda , la classe che crea JFormattedTextField formattati decimali
 
public class MyTextFieldDecimal extends JFormattedTextField {
      public MyTextFieldDecimal() {
        setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        formatting();
    }
    private void formatting(){
        MyNumberControl ncontrol = new MyNumberControl();
        this.setDocument(ncontrol);
        DecimalFormatSymbols dfs = new DecimalFormatSymbols();
        dfs.setDecimalSeparator('.');
        DecimalFormat df = new DecimalFormat("0.00",dfs);
        NumberFormatter dformatter = new NumberFormatter(df);
        DefaultFormatterFactory formatter = new DefaultFormatterFactory(dformatter);
        setFormatterFactory(formatter);
        setValue(new Float(0));
    }
 
 
Come vedi nel metodo formatting della seconda classe assegno con setDocument() il filtraggio dei numeri. Il comportamento non è quello sperato , perchè io riesco a scrivere dei caratteri all'interno delle textfield lasciando il focus questi caratteri spariscono perchè non riesco ad essere formattati e rimango solo i numeri formattati correttamente. Se su una semplice JTextField invece setti il filtro con la prima classe, si ottiene l'effetto che voglio , cioè qualora digitassi dei caratteri, questi non vengono neanche scritti nella textbox, ma vengono scritti solo i numeri (che poi non saranno formattati poichè non è impostato nessun formatter)
Che ne pensi
Grazie mille

          if (!(str!=null&&  pattern.matcher(str).matches())){

Nella documentazione del JFormattedTextField si dice espressamente:
 
As the AbstractFormatter will typically install a DocumentFilter on the 
Document, and a NavigationFilter on the JFormattedTextField *you should 
not install your own*. If you do, you are likely to see odd behavior in 
that the editing policy of the AbstractFormatter will not be enforced.
 
per cui direi che scegliere la strada di installare il tuo document, non 
sia quella giusta.

Il giorno domenica 3 giugno 2012 00:43:19 UTC+2, 
godm...@tiscali.it
 ha scritto:

Ti ringrazio di avermi fatto notare quel warning ma sinceramente non ne capisco completamente il senso, ti chiedo quindi di darmi delle delucidazioni in merito e soprattutto darmi un'indicazione di come potrei procedere per ottenere l'effetto voluto..
grazie

 grazie
Delucidazioni non te ne so dare, li' dicono di non sostituire il 
document, e tanto basta per me.
Probabilmente io avrei utilizzato il formatter che si crea il 
JFormattedTextField modificandone la configurazione. Ad esempio:
public class Prova extends JFormattedTextField {
	public Prova() {
		super();
		setFocusLostBehavior(REVERT);
		setValue(new Float(0));
		NumberFormatter nf = (NumberFormatter)getFormatter();
		DecimalFormat df = (DecimalFormat)nf.getFormat();
		DecimalFormatSymbols ds = df.getDecimalFormatSymbols();
		ds.setDecimalSeparator('.');
 
		df.applyPattern("0.00");
/* oppure */
		df.setGroupingUsed(false);
		df.setMaximumFractionDigits(2);
		df.setMaximumIntegerDigits(1);
		setValue(null);
	}
}
 
poi magari puoi modificare il comportamento con una tecnica del tipo:
 
try {
	commitEdit();
} catch (ParseException pe) {
	setValue(getValue(), false, false);
}
 
implementata nel listener del document.

Il giorno domenica 3 giugno 2012 00:43:19 UTC+2, 
godm...@tiscali.it
 ha scritto:

Ti ringrazio dell'esempio ma non fa affatto quello che occorre a me.