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

    Far inserire e stampare solo caratteri specifici nel JTextField


    stavo cercando una soluzione per il mio programma. In poche parole devo fare una calcolatrice con la grafica di java, devo consentire di inserire solamente numeri (interi o no) e nel caso si pigiasse un tasto di un carattere non valido, non dovrebbe nemmeno visualizzarlo nel textfield, ho cercato quaclosa in internet ma non ci ho capito molto. Qualcuno che mi possa aiutare??
    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Una soluzione potrebbe essere l'uso di un JFormattedTextField, a cui aggiungi un DocumentFilter fatto apposta per le tue esigenze.

    Ti posto il codice un po' modificato di un esempio che mi ero fatto qualche tempo fa, in questo momento il filtro blocca tutti i caratteri ad eccezione dei numeri e dei caratteri '-' e '.' , che ti consentono di scrivere numeri negativi e decimali.

    codice:
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Toolkit;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JFormattedTextField;
    import javax.swing.SwingUtilities;
    import javax.swing.border.EmptyBorder;
    import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.DefaultFormatter;
    import javax.swing.text.Document;
    import javax.swing.text.DocumentFilter;
    public class FilteredTextField
    {
    	public static void main(String[] args)
    	{
    		SwingUtilities.invokeLater(new Runnable(){
    			public void run(){
    				new TestFilterFrame().setVisible(true);
    			}
    		});
    	}
    }
    class TestFilterFrame extends JFrame
    {
    	public TestFilterFrame()
    	{
    		super("Test Filter");
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER,50,50));
    		JFormattedTextField field=new JFormattedTextField(new Formatter());
    		field.setPreferredSize(new Dimension(100,field.getPreferredSize().height));
    		panel.add(field);
    		setContentPane(panel);
    		pack();
    		setLocationRelativeTo(null);
    	}
    	private class Formatter extends DefaultFormatter
    	{
    		private DocumentFilter filter = new Filter();
    		protected DocumentFilter getDocumentFilter()
    		{
    			return filter;
    		}
    		private class Filter extends DocumentFilter
    		{
    			public boolean isValidCharacter(char c)
    			{
    				return c=='0'||c=='1'||c=='2'||c=='3'||c=='4'||c=='5'||c=='6'||c=='7'||c=='8'||c=='9'||c=='-'||c=='.';
    			}
    			public boolean isTextValid(String text)
    			{
    				for(int i=0;i<text.length();i++)if(!isValidCharacter(text.charAt(i)))return false;
    				return true;
    			}
    			@Override
    			public void replace(FilterBypass fb,int offset,int length,String text,AttributeSet attrs)throws BadLocationException
    			{
    				if(isTextValid(text))super.replace(fb,offset,length,text,attrs);
    				else Toolkit.getDefaultToolkit().beep();
    			}
    		}
    	}
    }

  3. #3
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Una soluzione potrebbe essere l'uso di un JFormattedTextField, a cui aggiungi un DocumentFilter fatto apposta per le tue esigenze.

    Ti posto il codice un po' modificato di un esempio che mi ero fatto qualche tempo fa, in questo momento il filtro blocca tutti i caratteri ad eccezione dei numeri e dei caratteri '-' e '.' , che ti consentono di scrivere numeri negativi e decimali.

    codice:
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Toolkit;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JFormattedTextField;
    import javax.swing.SwingUtilities;
    import javax.swing.border.EmptyBorder;
    import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.DefaultFormatter;
    import javax.swing.text.Document;
    import javax.swing.text.DocumentFilter;
    public class FilteredTextField
    {
        public static void main(String[] args)
        {
            SwingUtilities.invokeLater(new Runnable(){
                public void run(){
                    new TestFilterFrame().setVisible(true);
                }
            });
        }
    }
    class TestFilterFrame extends JFrame
    {
        public TestFilterFrame()
        {
            super("Test Filter");
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER,50,50));
            JFormattedTextField field=new JFormattedTextField(new Formatter());
            field.setPreferredSize(new Dimension(100,field.getPreferredSize().height));
            panel.add(field);
            setContentPane(panel);
            pack();
            setLocationRelativeTo(null);
        }
        private class Formatter extends DefaultFormatter
        {
            private DocumentFilter filter = new Filter();
            protected DocumentFilter getDocumentFilter()
            {
                return filter;
            }
            private class Filter extends DocumentFilter
            {
                public boolean isValidCharacter(char c)
                {
                    return c=='0'||c=='1'||c=='2'||c=='3'||c=='4'||c=='5'||c=='6'||c=='7'||c=='8'||c=='9'||c=='-'||c=='.';
                }
                public boolean isTextValid(String text)
                {
                    for(int i=0;i<text.length();i++)if(!isValidCharacter(text.charAt(i)))return false;
                    return true;
                }
                @Override
                public void replace(FilterBypass fb,int offset,int length,String text,AttributeSet attrs)throws BadLocationException
                {
                    if(isTextValid(text))super.replace(fb,offset,length,text,attrs);
                    else Toolkit.getDefaultToolkit().beep();
                }
            }
        }
    }
    Grazie ma non č che potresti spiegarmelo? Non mi va di copiare il codice senza capirlo e ci sono alcune cose di cui non ho idea, e su internet avevo trovato qualcosa simile, ma non avevo capito molto. Grazie comunque

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Quote Originariamente inviata da fabio1234 Visualizza il messaggio
    Grazie ma non é che potresti spiegarmelo?
    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
    Ultima modifica di Ansharja; 26-05-2016 a 13:59

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.