Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [Java] JTextField numerico con segni

    Ho visto parecchi post a riguardo ma non sono riuscito a beccare quello che mi serve. Allora io ho creato una JTextField e ho modificato il Document in modo che posso scrivere solo numeri seguendo un esempio posto su questo forum, solo che vorrei anche introdurre la digitazione del carattere meno ( - ) per i numeri negativi, come posso fare? ecco il codice che ho usato:

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


    Grazie per le risposte.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] JTextField numerico con segni

    Originariamente inviato da torment666
    seguendo un esempio posto su questo forum
    Forse un mio esempio?

    Originariamente inviato da torment666
    vorrei anche introdurre la digitazione del carattere meno ( - ) per i numeri negativi, come posso fare?
    Beh, intuitivamente basta controllare se il '-' viene inserito all'offset 0. Ti viene passato un offset e una stringa con il contenuto inserito. Il contenuto tipicamente è composto da un solo carattere se è digitato a mano, ma un testo può anche essere inserito programmaticamente, quindi non devi presupporre che la stringa contenga solo 1 carattere.

    Se l'offset è 0 e il primo carattere è '-' allora è ok. Altrimenti lo togli.

    EDIT: Con un piccolo dettaglio in più che mi stavo dimenticando: bisogna anche controllare che nel document non ci sia già un '-' iniziale!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    si forse è tuo l'esempio ^^ solo che ho preso quell'esempio perche ho visto che faceva quello che volevo io ma non l'ho capito bene, cioè come funziona? cosi almeno posso capire che modificare.
    Tipo questa riga if(str!=null && str.matches("[\\d]*")) cosa fa? che vuol dire "[\\d]*". Sapendo come funziona il codice potrei riuscire ad inserire quel meno.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da torment666
    solo che ho preso quell'esempio perche ho visto che faceva quello che volevo io ma non l'ho capito bene, cioè come funziona? cosi almeno posso capire che modificare.
    Tipo questa riga if(str!=null && str.matches("[\\d]*")) cosa fa? che vuol dire "[\\d]*". Sapendo come funziona il codice potrei riuscire ad inserire quel meno.
    Io farei così:

    codice:
    class SignedNumericDocument extends PlainDocument
    {
        public void insertString (int offs, String str, AttributeSet a)
            throws BadLocationException
        {
            if (str != null)
            {
                String text = getText (0, getLength ());
    
                char[] vch = str.toCharArray ();
                int i, j;
    
                for (i = j = 0; i < vch.length; i++)
                {
                    if (Character.isDigit (vch[i]) || vch[i] == '-' && offs+i == 0 && !text.startsWith ("-"))
                        vch[j++] = vch[i];
                }
    
                super.insertString (offs, new String (vch, 0, j), a);
            }
        }
    }
    Cioè:
    - accetto un carattere se è un digit
    oppure
    - accetto un '-' purché sia in posizione 0 e non ci sia già un '-' iniziale nel document.

    Ho fatto un "filtro" sui singoli caratteri e non un controllo sull'intera stringa con matches() per un motivo molto semplice: se a insertString() viene passata una stringa es. "ciao123" con matches() rifiuteresti l'intera stringa. Questo non è il massimo. Dovrebbe comportarsi come se i caratteri nella stringa venissero digitati singolarmente. 'c' 'i' 'a' 'o' li rifiuti mentre '1' '2' '3' dovresti accettarli.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    ok l'ho provato è funziona solo che non riesco molto a capirlo, mi potresti fare un commento per ogni rigo di codice per dirmi cosa fa? Poi volendo questo codice si potrebbe modificare per aggiungere anche un altro carattere? tipo (/). E si può mettere anche il limite di cifre? tipo mettere un limite a 5 cifre.

    ps. Non voglio che mi modifichi il codice per fare cioè che ho chiesto altrimenti se non lo faccio io non lo capisco ^^, solo i commenti per capire cosa fa ogni riga di codice e se quelle cose si possono fare o no. Grazie davvero tantissimo.

  6. #6
    Sto provando a modificare un pò il codice per provare solo che non capisco cosa fa questa riga vch[j++] = vch[i];

    int i, j; e questi a cosa si riferiscono?

    ho provato a mettere
    codice:
     if (Character.isDigit (carattere[i]) || carattere[i] == '-' && offs+i == 0 && !text.startsWith ("-"))
    	                	carattere[j++] = carattere[i];
    	else                
    	     if (Character.isDigit (carattere[i]) || carattere[i] == '/' && offs+i == 2 && !text.startsWith ("-"))
    	                    carattere[j++] = carattere[i];
    aggiungendo l'else mi mette il / dopo 2 cifre se non c'è il meno, ho provato a togliere l'else ma poi non mi faceva mettere piu i numeri ><

    Questo perche non ho capito bene il codice, l'enunciato for ancora non lo so usare bene. Aspetto tue risposte

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Con la riga:

    char[] vch = str.toCharArray ();

    ottengo chiaramente un array di char con i caratteri della stringa, fin qui è semplice.

    Con la riga:

    vch[j++] = vch[i];

    faccio un'altra cosa: in pratica riscrivo sull'array saltando i caratteri da rifiutare. Ci sono 2 indici: 'i' e 'j'. Il primo va sempre avanti in modo lineare (c'è il i++ nel for, quindi ad ogni ciclo si incrementa). il secondo si incrementa solamente man mano che riscrivo caratteri "buoni" nell'array. Il risultato finale è che i caratteri "buoni" vengono "compattati" all'inizio dell'array.

    Se non ti piace, usa uno StringBuffer/StringBuilder in cui aggiungi al fondo i caratteri validi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Allora metto un commento su ogni riga che ho capito:

    codice:
    class SignedNumericDocument extends PlainDocument // Estende la classe a PlainDocument
    {
        public void insertString (int offs, String str, AttributeSet a) //questa diciamo che l'ho capita anche se non so quali siano gli AttributeSet e cosa significhi offset
            throws BadLocationException
        {
            if (str != null) // se la stringa non è nulla esegue il corpo dell'enunciato
            {
                String text = getText (0, getLength ()); // crea una variabile di tipo stringa, però non capisco il significato dei parametri di getText
    
                char[] vch = str.toCharArray (); // questa me l'hai spiegata adesso (quindi ci sono tutti i caratteri qui dentro no?)
                int i, j; // qui semplicemente dichiare di che tipo sono i e j
    
                for (i = j = 0; i < vch.length; i++) // qui credo che dica che i e j partano da 0  e i si incrementa continuamente fino a un numero in meno dellla lunghezza di vch
                {
                    if (Character.isDigit (vch[i]) || vch[i] == '-' && offs+i == 0 && !text.startsWith ("-")) // questa l'ho capita
                        vch[j++] = vch[i];  // qui praticamente incrementa j per il numero di i cioè se i = 5 allora j sara uguale a 5?
                }
    
                super.insertString (offs, new String (vch, 0, j), a);
            }
        }
    }
    solo che non capisco una cosa, qual'è il codice che vieta le lettere e accetta i numeri? e se voglio aggiungere un'altro carattere permesso devo creare un altro ciclo for?

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da torment666
    solo che non capisco una cosa, qual'è il codice che vieta le lettere e accetta i numeri?
    È la condizione nel if dentro il for. Ripeto la logica: ci sono 2 indici: i e j. Entrambi partono da 0. Il 'i' serve per "leggere" i caratteri e va avanti in modo continuo. Il 'j' serve per scrivere i caratteri (quelli accettati). Il fatto è che entrambi operano sullo stesso array! Ma non ha grossa importanza. Mentre l'indice di lettura va avanti, quello di scrittura scrive nell'array in modo contiguo solo i caratteri accettati.

    È banale come algoritmo ....

    Originariamente inviato da torment666
    se voglio aggiungere un'altro carattere permesso devo creare un altro ciclo for?
    No. Basta modificare la condizione nel if.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    ma io continuo a non capire, cioè dove sta scritto che j scrive solo i numeri e non gli altri caratteri?


    edit: isDigit???


    edit2: ho modificato così:
    codice:
         if (Character.isDigit (carattere[i]) || carattere[i] == '-' && offs+i == 0 && !text.startsWith ("-") || carattere[i] == '/' && offs+i == 2)
    	                	carattere[j++] = carattere[i];
    solo che vorrei che non tenesse conto del meno altrimenti mi mette -2/... perche conta il meno come carattere.

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.