Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [Java] JFormattedTextField vs separatore migliaia

    Ciao Ragazzi,
    utilizzo una JFormattedTextField nella quale formatto il numero inserito con i separatori delle migliaia.
    il codice usato è :

    JFormattedTextField input3 = new JFormattedTextField(NumberFormat.getIntegerInstanc e());
    input3.setColumns(10);
    input3.setFocusLostBehavior(JFormattedTextField.CO MMIT);

    con questo codice il numero inserito viene formattato quando il JTF perde il focus.
    Io volevo far si che il numero si formattasse man mano che lo digito sempre all'interno del JTF.

    come posso fare ?
    Grazie

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303
    Premesso che la cosa non è simpatica dal punto di vista dell'utente (non è come con le date che si possono utilizzare i segnaposto per i caratteri corrispondenti al giorno/mese/anno che serve a guidare l'utente) vedersi cambiare a video un numero mentre lo sta digitando, comunque la cosa può essere fatta senza nemmeno utilizzare una JFormattedTextField, ma una banale JTextField: basta settargli un Document che sia in grado di modificare "al volo" il contenuto da inserire in modo che lo renda "formattato":


    codice:
       public class MyIntegerDocument extends PlainDocument {
          private static final NumberFormat nf = NumberFormat.getIntegerInstance( Locale.ITALIAN );
    
          @Override
          public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
             if (str == null) {
                return;
             }
    
             if ( !str.matches("\\d+") ) return;
    
             String myText = getText(0, getLength()).replaceAll("\\.","") + str;
             int myVal = Integer.parseInt( myText );
    
             myText = nf.format( myVal );
    
             super.remove(0, getLength());
             super.insertString(0, myText, a);
          }
       }

    Settando il Document di esempio in una JTextField dovresti avere il risultato cercato, ad esempio:

    codice:
    JTextField txt = new JTextField();
    txt.setDocument( new MyIntegerDocument() );
    txt.setPreferredSize( ... );

    Il Document proposto effettua anche un minimo di "validazione" dell'input: accetta solo cifre (non caratteri diversi).


    Ciao.
    Ultima modifica di LeleFT; 15-03-2018 a 17:02
    "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

  3. #3
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Premesso che la cosa non è simpatica dal punto di vista dell'utente (non è come con le date che si possono utilizzare i segnaposto per i caratteri corrispondenti al giorno/mese/anno che serve a guidare l'utente) vedersi cambiare a video un numero mentre lo sta digitando, comunque la cosa può essere fatta senza nemmeno utilizzare una JFormattedTextField, ma una banale JTextField: basta settargli un Document che sia in grado di modificare "al volo" il contenuto da inserire in modo che lo renda "formattato":


    codice:
       public class MyIntegerDocument extends PlainDocument {
          @Override
          public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
             if (str == null) {
                return;
             }
    
             if ( !str.matches("\\d+") ) return;
    
             String myText = getText(0, getLength()).replaceAll("\\.","") + str;
             int myVal = Integer.parseInt( myText );
    
             NumberFormat nf = NumberFormat.getIntegerInstance( Locale.ITALIAN );
             nf.setGroupingUsed( true );
    
             myText = nf.format( myVal );
    
             super.remove(0, getLength());
             super.insertString(0, myText, a);
          }
       }

    Settando il Document di esempio in una JTextField dovresti avere il risultato cercato, ad esempio:

    codice:
    JTextField txt = new JTextField();
    txt.setDocument( new MyIntegerDocument() );
    txt.setPreferredSize( ... );

    Il Document proposto effettua anche un minimo di "validazione" dell'input: accetta solo cifre (non caratteri diversi).


    Ciao.
    ok grazie lo provo subito.
    ciao

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303
    Attenzione che ho modificato il codice del mio post: il NumberFormat non ha senso crearlo nuovo ad ogni modifica: è un po' più performante averlo già creato una volta per tutte e riutilizzare la stessa istanza... inoltre il grouping è già a true di default.

    Attenzione 2: quel codice funziona solo con numeri interi... per avere qualcosa che lavori con numeri con la virgola le cose si complicano un pochino (non moltissimo).


    Ciao.
    Ultima modifica di LeleFT; 15-03-2018 a 17:14
    "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

  5. #5
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Attenzione che ho modificato il codice del mio post: il NumberFormat non ha senso crearlo nuovo ad ogni modifica: è un po' più performante averlo già creato una volta per tutte e riutilizzare la stessa istanza... inoltre il grouping è già a true di default.

    Attenzione 2: quel codice funziona solo con numeri interi... per avere qualcosa che lavori con numeri con la virgola le cose si complicano un pochino (non moltissimo).


    Ciao.

    ok grazie per la dritta.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.