Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    347

    JTextField che accetta solo numeri

    Salve a tutti,
    ho un problema con una JTextField. Avrei bisogno che mi accettasse solo valori numerici.
    Girando per la rete, ho trovato vari suggerimenti, come per esempio aggiungere un listener a JTextField in modo tale ogni qualvolta venga premuto un tasto sulla tastiera si settava il Document passandagli come parametro NumberDocument (classe trovata in rete. Esempio: myTextField.setDocument(new NumberDocument()); ).
    Riporto la classe NumberDocument:

    public class NumberDocument extends PlainDocument {
    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
    if(str!=null && str.matches("[\\d]*"))
    super.insertString(offs, str, a);
    }
    }

    quando lancio la mia applicazione, nella JTextField in questione, mi fa inserire solo valori numerici ma solo un carattere alla volta mentre io avrei la necessità di poterne inserire un numero arbitrario.
    spero di essere stato chiaro

    Saluto e ringrazio
    nh

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Vedi tra i miei Java Examples, sezione Text components. L'esempio DigitsOnlyTextFields.java.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    347
    Grazie mille per la velocissima risposta ma purteoppo non mi funziona, continua a farmi digitare sempre un solo carattere. Ti riposrto più nel dettaglio cosa ho fatto:

    Classe dove si trova la mia GUI con la JTextField:

    codice:
    textField_4 = new JTextField();
    			textField_4.addKeyListener(new KeyAdapter() {
    				@Override
    				public void keyPressed(KeyEvent arg0) {
    					
    					NumberDocument digitsOnlyDoc1 = new NumberDocument();
    					textField_4.setDocument(digitsOnlyDoc1);
    				}
    			});
    Nella classe NumberDocument ho copiato una porzione del tuo codice che riporto:

    codice:
    public class NumberDocument extends PlainDocument {
    	
        public void insertString(int offs, String str, AttributeSet a)
        throws BadLocationException {
            if (str == null)
                return;
    
            StringBuffer sb = new StringBuffer(str.length());
    System.out.println(str.length());
            for (int i = 0; i < str.length(); i++) {
                char c = str.charAt(i);
                // Inserts the character into the buffer
                // ONLY if it is a digit.
                if (Character.isDigit(c)) {
                    sb.append(c);
                }
            }
    
            super.insertString(offs, sb.toString(), a);
        }
    
    }
    ho aggiunto un stampa della lunghezza che mi ritorna sempre 1.
    attendo suggerimenti
    saluti
    nh

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Guarda che non serve alcun KeyListener e il DigitsOnlyPlainDocument (o come tu vuoi poi chiamarlo) devi istanziarlo e sopratutto assegnarlo al JTextField (tramite costruttore o setDocument() ) solo 1 volta!!!

    Possibile che nemmeno con un esempio completo sia chiaro???
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    C'è un regolamento, fra i link in rilievo, dove viene detto esplicitametne che quando si posta del codice si devono usare i tag CODE... Punto 6, per la precisione.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    347
    Grazie mille, ora funzione. ti riporto cosa ho fatto:

    codice:
    textField_4 = new JTextField();
    textField_4.addKeyListener(new KeyAdapter() {
    	NumberDocument numberDocument = new NumberDocument();
    	@Override
    	public void keyPressed(KeyEvent arg0) {
    	textField_4.setDocument(numberDocument);
    				}
    	});
    se puoi, potresti ripetermi l'errore, non l'ho capito bene.
    Ancora grazie.

    Ma il bottone per il tag [code] dove si trova?

    nh

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da newhook
    codice:
    textField_4 = new JTextField();
    textField_4.addKeyListener(new KeyAdapter() {
    	NumberDocument numberDocument = new NumberDocument();
    	@Override
    	public void keyPressed(KeyEvent arg0) {
    	textField_4.setDocument(numberDocument);
    				}
    	});
    In questo caso l'oggetto NumberDocument è sempre solo 1 (perché è istanziato e assegnato 1 volta al campo di istanza dell'oggetto della anonymous class che estende KeyAdapter). E in keyPressed semplice assegni, ad ogni digitazione, lo stesso identico oggetto NumberDocument, che essendo lo stesso non cambia appunto nulla ....

    Che quindi tecnicamente funziona ma .... è del tutto inutile!!!!

    Lo ripeto: non serve alcun KeyListener. Non capisco perché ti ostini ad usare un KeyListener!!
    Il Document rappresenta l'intero "stato" del campo di testo. Basta impostarlo 1 volta sola.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    347
    ok, sei stato chiarissimo.
    ti riporto la porzione di codice di ciò che ho fatto.

    codice:
    textField_4 = new JTextField();
    NumberDocument numberDocument = new NumberDocument();
    textField_4.setDocument(numberDocument);
    saluti
    nh

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    347
    ok, sei stato chiarissimo.
    ti riporto la porzione di codice di ciò che ho fatto.

    codice:
    textField_4 = new JTextField();
    NumberDocument numberDocument = new NumberDocument();
    textField_4.setDocument(numberDocument);
    saluti
    nh

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da newhook
    Ma il bottone per il tag [code] dove si trova?
    E' quel pulsantino contrassegnato dal simbolo ( # ) prima dei pulsanti PHP, List e Quote.
    Ma, generalmente, è più comodo scrivere direttamente i tag, in quanto quel pulsante fa apparire una casella di testo che, da sola, è decisamente troppo limitata per un sorgente complesso, che si estende su più righe...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.