Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883

    (java) Come limitare l'inserimento in componenti swing a soli numeri

    Utilizzo il seguente codice per impedire l'inserimento, in un componente swing (jtextfield), di caratteri che non siano numeri.

    codice:
    public class LimitNumberDocument extends PlainDocument{
    
    	private static final long serialVersionUID = -6829435640064907333L;
    	
    	private int max_length = 0;
        
        public LimitNumberDocument(int max_length) {
            this.max_length = max_length;
        }
        
        public void insertString(int offs, String str, AttributeSet a)
            throws BadLocationException{
                try{
                    //se aggiungo numeri negativi ritorno
                    //if(Integer.parseInt(str) < 0) {
                	if(Long.parseLong(str) < 0) {
                    	System.err.println("numero negativo non ammesso");
                        return;
                    }
                }
                catch(NumberFormatException e){            	
                    //se non è un numero ritorno
                	System.err.println("NumberFormatException");
                    return;
                }            
    
                int chNumberInsert = getText(0, offs).length();
                int chNumberToInsert = str.length();
                int chNumberMax = chNumberInsert + chNumberToInsert;
                if (chNumberMax <= max_length)
                    super.insertString(offs, str, a);
                else
                	System.out.println("numero di lunghezza superiore a quella permessa per il campo");
            }
    
        }
    Purtroppo se inserirsco un numero troppo lungo, ad esempio: 666666666666666666666
    il codice riportato mi eccede nel punto Long.parseLong, ed il numero non viene accettato

    Come faccio ad evitare questo problema?

  2. #2
    Puoi usare i codici asci dei caratteri che vanno da 16 (per lo 0) a 25 (per il 9) tutti gli altri codici asci sono per lettere o segni vari!
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    e quindi che codice dovrei utilizzare se volessi implementare la soluzione degli ASCII?

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,319
    Originariamente inviato da Matteo982
    Puoi usare i codici asci dei caratteri che vanno da 16 (per lo 0) a 25 (per il 9) tutti gli altri codici asci sono per lettere o segni vari!
    Direi che i codici vanno da 48 (0x30) a 57 (0x39).
    Originariamente inviato da abcd1000
    e quindi che codice dovrei utilizzare se volessi implementare la soluzione degli ASCII?
    Dovresti definire un KeyListener per la TextField e intercettare l'evento keyPressed(), all'interno del quale controllare il codice del carattere battuto sulla tastiera.


    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

  5. #5
    Originariamente inviato da LeleFT
    Dovresti definire un KeyListener per la TextField e intercettare l'evento keyPressed(), all'interno del quale controllare il codice del carattere battuto sulla tastiera.
    Il problema è come impedire che il carattere venga inserito nella JTextField! :master:
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

  6. #6
    Originariamente inviato da LeleFT

    Dovresti definire un KeyListener per la TextField e intercettare l'evento keyPressed(), all'interno del quale controllare il codice del carattere battuto sulla tastiera.


    Ciao.
    No secondo me la strada che sta seguendo abcd1000 è migliore,con il key listener non riesci a filtrare gli eventi cut and paste
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  7. #7

    Re: (java) Come limitare l'inserimento in componenti swing a soli numeri

    Originariamente inviato da abcd1000

    Purtroppo se inserirsco un numero troppo lungo, ad esempio: 666666666666666666666
    il codice riportato mi eccede nel punto Long.parseLong, ed il numero non viene accettato

    Come faccio ad evitare questo problema?
    Però con il suo metodo c'è sempre il solito problema che lui stesso ha fatto notare.
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

  8. #8
    codice:
    import java.awt.FlowLayout;
    
    import javax.swing.JFrame;
    import javax.swing.JTextField;
    import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.PlainDocument;
    
    public class OnlyNumbersTextField extends JTextField
    {
    
        /**
         * 
         */
        private static final long serialVersionUID = 8554350982699149972L;
    
        /**
         * @param args
         */
        public static void main(String[] args)
        {
            JFrame frame = new JFrame();
            frame .setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocationRelativeTo(null);
            frame.getContentPane().setLayout(new FlowLayout());
            frame.getContentPane().add(new OnlyNumbersTextField(10));
            frame.pack();
            frame.setVisible(true);
        }
    
        /*
         * Costruttore con unico parametro il limite della textfield
         */
        public OnlyNumbersTextField(int cols)
        {
            super(cols);
            setDocument(new TextLimitDocument());
        }
    
        /***************************************************************************
         * Classe interna per la gestione dell'input
         **************************************************************************/
        private class TextLimitDocument extends PlainDocument
        {
            /**
             * 
             */
            private static final long serialVersionUID = 5408078764971166982L;
    
            /*
             * Funzione per l'inserimento della stringa nella textfield
             */
            public void insertString(int offset, String str, AttributeSet attr)
                    throws BadLocationException
            {
                boolean invalid = false;
    
                if (str == null)
                    return;
    
                if (!str.matches("[0-9]*"))
                    return;
    
                super.insertString(offset, str, attr);
    
            }
        }
    
    }
    Ho buttato giù due righe di codice in due minuti, questa soluzione ha un problema: se inserisci tramite copia e incolla una stringa che contiene sia numeri che altri caratteri l'intera stringa viene rifiutata mentre l'ideale sarebbe inserire solo i numeri di quella stringa, non dovrebbe essere difficile migliorarla in queto senso, lo lascio a te
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  9. #9

    Re: Re: (java) Come limitare l'inserimento in componenti swing a soli numeri

    Originariamente inviato da Matteo982
    Però con il suo metodo c'è sempre il solito problema che lui stesso ha fatto notare.
    Intendevo il metodo di sovrascrivere il plain document non quello di usare un Parse per vedere se è un numero o no.Diciamo che la mia soluzione fonde il tuo suggerimento e una parte della sua soluzione
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  10. #10
    I commenti della classe postata sono senza significato,sono solo un refuso di un'altra mia classe che ho modificato per creare questa.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

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.