Certo, ma abituati anche a controllare la documentazione relativa alle classi che ti interessano, ad esempio vedi qui per quanto riguarda la classe DocumentFilter (se in alto clicchi su Frames, hai l'overwiew di tutte le classi e puoi facilmente controllare tutti i metodi di interesse).
In ogni caso il tuo problema era vietare l'inserimento di alcuni caratteri nel textfield, lo puoi fare in piu' modi, uno dei quali é l'utilizzo di un JFormattedTextField.
Tra i costruttori di JFormattedTextField ce n'é uno che prende come parametro un JFormattedTextField.AbstractFormatter, che potrai utilizzare per creare un filtro al tuo textfield.
E' quello che faccio nel mio codice: la parte iniziale serve solo a costruire il frame che ti mostri il JFormattedTextField, a te interessa solo il punto in cui creo il JFormattedTextField passando come parametro una classe definita da me, Formatter.
La classe estende DefaultFormatter , che estendendo a sua volta AbstractFormatter puó essere passato al JFormattedTextField.
DefaultFormatted ha un metodo dichiarato come protected, chiamato getDocumentFilter(), l'oggetto restituito da questo metodo sarį il filtro che viene applicato al JFormattedTextField, e per questo motivo, nel metodo che ho riscritto io, in quel punto viene restituito un'oggetto della classe Filter, altra classe creata da me e che estende DocumentFilter.
Tutta questa catena di classi puó sembrarti lunga e contorta, ma non esistono metodi per aggiungere un filtro direttamente al tuo textfield, devi perció "passarlo" all'oggetto che formatta il tuo JFormattedTextField.
Ora passiamo alla parte principale, quella che permette di creare un filtro: se controlli la documentazione che ho linkato sopra, vedrai che DocumentFilter presenta tre metodi: insertString, remove e replace. Questi sono i metodi che vengono richiamati quando tu modifichi in qualche modo il testo contenuto nel JFormattedTextField, quindi facendone l'override potrai ottenere il comportamento da te desiderato.
Se vedi nel mio codice, io faccio solo l'override del metodo replace, che si occupa di inserire i caratteri sia che tu li stia digitando singolarmente (avendo o meno selezionato una parte di testo da sostituire con i nuovi caratteri), sia che tu li stia copiando e incollando.
Quindi é questo il metodo che devi modificare per bloccare o meno l'inserimento di caratteri indesiderati nel tuo textfield.
Il modo in cui faccio l'override di quel metodo non é complicato: ho creato un metodo isTextValid() che prende in input il testo che stai tentando di inserire nel textField, all'interno del metodo controllo la validitį di ogni singolo carattere, e restituisco true solo se tutti i caratteri sono validi (nel caso in questione sono considerati validi i numeri, il segno meno e il punto per scrivere i decimali).
Solo se il metodo mi restituisce true procedo con l'inserimento del testo, se noti non lo faccio io esplicitamente ma mi limito a richiamare il metodo della superclasse con la chiamata a super.replace(), quindi l'inserimento viene effettuato in automatico.
Tu stai solo impedendo che esso avvenga se il testo inserito non é corretto...
Volendo puoi anche impedire la cancellazione di alcuni caratteri, o cambiare il testo che viene inserito o altro ancora, questo filtro é molto semplificato e fa esclusivamente quello che ho detto.
Spero sia tutto piu' chiaro ora![]()