Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305

    Jbutton e Input verifier

    Salve a tutti ho il seguente problema , ho un form tipo quelli di word per la ricerca delle parole in un testo, il problema è questo ho attivato sulla jformattedtextfield un inputverifier, in modo tale da non effettuare ricerche di valori che sicuramente non esistono. Se ad esempio inserisco un valore non esistente e premo cerca , ottengo un messaggio di errore, e fin qui tutto ok, il problema che è solo grafico tra l'altro e che il jbutton funziona ancora ma è come se restasse premuto.Immagineq.jpg
    Ho provato ad abilitarlo col metodo setselected della classe jbutton ma nulla !! Sapreste aiutarmi?

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Senza vedere cosa hai scritto è difficile...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Questo è il form
    codice:
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.FocusEvent;
    import java.awt.event.FocusListener;
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JFormattedTextField;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableModel;
    
    
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    /**
     *
     * @author Linux
     */
    public class FormCercaCliente extends JFrame {
        private static boolean find_least_one;
        private static int i;
        private JComboBox jCombo;
        private JFormattedTextField jFormat;
        private JButton jButton;
        private JPanel jPanel1;
        private JPanel jPanel2;
        private JTable jTable;
        public FormCercaCliente(JTable jTable)
        {
            this.jTable=jTable;
        }
        public void initComponents() {
            this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            //SI SUPPONE CHE IL FRAME SIA UNA MATRICE 2 RIGHE E UNA COLONNA
            //IN OGNI CELLA METTO UN JPANEL IN MODO DA SFRUTTARE PER OGNI JPANEL DIVERSI
            //LAYOUT MANAGER
            String[] values = {"ID", "Name", "Surname", "ZipCode", "E-Mail"};
            this.setTitle("Search for ");
            GridBagLayout grid = new GridBagLayout();//LAYOUT JFRAME
            GridBagConstraints c = new GridBagConstraints();
            this.setLayout(grid);
            c.weightx = 1;
            c.weighty = 1;
            c.gridx = 0;
            c.gridy = 0;
            c.insets.top = 0;
            c.insets.left = 0;
            c.ipadx = this.getWidth();
            c.ipady = (int) (0.85 * this.getHeight());
            c.fill = GridBagConstraints.BOTH;
            c.gridwidth = GridBagConstraints.REMAINDER;//DOPO IL PRIMO PANNELLO VADO A CAPO PER INSERIRE IL SECONDO
            //nella seconda cella che si trova virtualmente sotto la prima
            jPanel1 = new JPanel();
            jPanel2 = new JPanel();
            //INSERISCO IL PRIMO PANNELLO NELLA PRIMA CELLA DELLA GRIGLIA
            //LA DIMENSIONE SERVE PER DARE DIMENSIONE ALLA CELLA
            grid.setConstraints(jPanel1, c);//ABILITO I CONSTRAINTS
            Dimension d = new Dimension(this.getWidth(), c.ipady);
            jPanel1.setPreferredSize(d);
            d.height = this.getHeight() - c.ipady;
            jPanel2.setPreferredSize(d);
            this.add(jPanel1);//INSERISCO L'ELEMENTO NEL FRAME
    
    
            //ELEMENTI PRIMO PANNELLO jPanel1
            jCombo = new JComboBox(values);
            jFormat = new JFormattedTextField();
            jFormat.setPreferredSize(null);
            jPanel1.setLayout(new FlowLayout(FlowLayout.LEFT));//AL PRIMO PANNELLO DO UN FLOWLAYOUT 
            jPanel1.add(new JLabel("Search for   "));
            jPanel1.add(jCombo);//INSERISCO LA JCOMBOBOX
            d.setSize(200, 29);
            jFormat.setPreferredSize(d);
            jPanel1.add(jFormat);
            jFormat.setText(null);
            jFormat.setEditable(true);
    
    
            //DIMENSIONI SECONDO PANNELLO
            c.gridy = 1;
            c.ipady = this.getHeight() - c.ipady;
            grid.setConstraints(jPanel2, c);
            this.add(jPanel2);//INSERIMENTO NELLA GRIGLIA SECONDO PANNELLO
            jButton = new JButton("Ok");
            jPanel2.add(jButton);//INSERIMENTO BOTTONE
            //DETERMINO POSIZIONE BOTTONE
            jButton.setLocation(jPanel2.getWidth() / 2, jPanel1.getHeight() + jPanel2.getHeight() / 2);
            String j = jCombo.getSelectedItem().toString();
            jFormat.addFocusListener(new FocusListener() {
    
    
                @Override
                public void focusGained(FocusEvent e) {
                    selectInputVerifier();
                }
    
    
                @Override
                public void focusLost(FocusEvent e) {
                }
    
    
            });
            jCombo.addActionListener(new ActionListener(){
                  @Override
                public void actionPerformed(ActionEvent e) {
                    selectInputVerifier();
                }
            });
            jButton.addActionListener(new ActionListener() {
    
    
                @Override
                public void actionPerformed(ActionEvent e) {
                       FormCercaCliente.this.findCustomers();
                }
            } );
            
            this.setVisible(true);
            this.pack();
            this.setResizable(false);
            this.setSize(jCombo.getWidth() + jFormat.getWidth() + 130, 130);//DIMENSIONE JFRAME
        }
        
        private void selectInputVerifier(){
            String j=jCombo.getSelectedItem().toString();
            String msg;
            switch (j) {
                case "ID":
                    msg = "Wrong Insert ID" + "\n Id must be numeric of size 4";
                    jFormat.setInputVerifier(new FieldInputVerifier("[0-9]+", msg, 4, 4,jButton));
                    break;
                case "Name":
                case "Surname":
                    msg = "Insert Error : The following field can only contain letters up to a maximum of 20";
                    jFormat.setInputVerifier(new FieldInputVerifier("[a-zA-Z]+", msg, 1, 20,jButton));
                    break;
                case "ZipCode":
                    msg = "Invalid ZipCode: ZipCode must bu numeric of 5 numbers";
                    jFormat.setInputVerifier(new FieldInputVerifier("[0-9]+", msg, 5, 5,jButton));
                    break;
                case "E-Mail":
                    msg = "Invalid E-Mail Address";
                    String r = "[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,4}";
                    jFormat.setInputVerifier(new FieldInputVerifier(r, msg, 1, 35,jButton));
                    break;
            }
    
    
        
    }
        
        private void findCustomers()
        {
            
            DefaultTableModel t=(DefaultTableModel)jTable.getModel();
            try{
              
               while(!t.getValueAt(i, jCombo.getSelectedIndex()).toString().toLowerCase().equals(jFormat.getText().toString().toLowerCase()))
                   i++;
               FormCercaCliente.find_least_one=true;
               jTable.setRowSelectionInterval(i, i);
               i++;
                
                
            }catch(ArrayIndexOutOfBoundsException  e)
            {
                i=0;
                this.dispose();
                if(find_least_one)
                    JOptionPane.showMessageDialog(null, "Nessun altro elemento per la chiave ricercata");
                else
                    JOptionPane.showMessageDialog(null, "Nessun elemento per la chiave ricercata");
                FormCercaCliente.find_least_one=false;
    
    
                    
            }
            
        }
    }
    Questo l'inputverifier
    codice:
      
    
    import java.util.regex.Pattern;
    import javax.swing.InputVerifier;
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JFormattedTextField;
    import javax.swing.JOptionPane;
    
    
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    
    
    /**
     *
     * @author linux
     */
    public class FieldInputVerifier extends InputVerifier {
    
    
    
    
        private String regex;
        private String msg;
        private int minLength;
        private int maxLength;
        private JButton jb;
        public  FieldInputVerifier(String reg_ex,String message,int minLength,int maxLength)
        {
            this.regex=reg_ex;
            this.msg=message;
            this.minLength=minLength;
            this.maxLength=maxLength;
        }
        public  FieldInputVerifier(String reg_ex,String message,int minLength,int maxLength,JButton jb)
        {
            this.jb=jb;
            this.regex=reg_ex;
            this.msg=message;
            this.minLength=minLength;
            this.maxLength=maxLength;
        }
        
      
            @Override
      public boolean verify(JComponent input) {
            boolean a;
            Pattern p=Pattern.compile(regex);
            JFormattedTextField jft=(JFormattedTextField)input;
            a=(Pattern.matches(p.toString(),jft.getText()) && jft.getText().length()<=maxLength &&  jft.getText().length()>=minLength);
            if(!a)
            {
               JOptionPane.showMessageDialog(null,msg );
              
            }
            return a;
        }
        
    }
    [COLOR=#EEE !important]en → it
    l' inputverifier

    [/COLOR]

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    ragazzi qualcuno può aiutarmi per piacere!! avrei anche bisogno di sapere se esiste un metodo per capire se un componente richiede il focus.

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Un grosso errore nel tuo codice è questo:


    codice:
    while(!t.getValueAt(i, jCombo.getSelectedIndex()).toString().toLowerCase().equals(jFormat.getText().toString().toLowerCase()))
                   i++;

    Ed è sicuramente il motivo per cui il pulsante "rimane premuto".


    Cosa accade se il valore che cerchi non viene mai trovato? Risposta... si crea un loop infinito. Già, perchè tutto quello che fai in quel while è aumentare l'indice "i"... senza controllare che non sfori i limiti della tabella. Quindi, dopo un po', comincerai ad ottenere una valanga di NullPointerException, ma tu imperterrito continuerai a far avanzare "i" alla prissima riga inesistente.

    E te ne saresti accorto subito se, da bravo programmatore, avessi avviato il programma da una finestra del prompt dei comandi, dove avresti visto questa valanga di eccezioni.


    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
    Jan 2014
    Messaggi
    305
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Un grosso errore nel tuo codice è questo:


    codice:
    while(!t.getValueAt(i, jCombo.getSelectedIndex()).toString().toLowerCase().equals(jFormat.getText().toString().toLowerCase()))
                   i++;

    Ed è sicuramente il motivo per cui il pulsante "rimane premuto".


    Cosa accade se il valore che cerchi non viene mai trovato? Risposta... si crea un loop infinito. Già, perchè tutto quello che fai in quel while è aumentare l'indice "i"... senza controllare che non sfori i limiti della tabella. Quindi, dopo un po', comincerai ad ottenere una valanga di NullPointerException, ma tu imperterrito continuerai a far avanzare "i" alla prissima riga inesistente.

    E te ne saresti accorto subito se, da bravo programmatore, avessi avviato il programma da una finestra del prompt dei comandi, dove avresti visto questa valanga di eccezioni.


    Ciao.
    Mi dispiace ti sbagli se vedi bene il codice sollevo un eccezione ArrayIndexOutOfBoundsException !!

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Allora il problema è :
    codice:
     public boolean verify(JComponent input) {
            boolean a;
            Pattern p=Pattern.compile(regex);
            JFormattedTextField jft=(JFormattedTextField)input;
            a=(Pattern.matches(p.toString(),jft.getText()) && jft.getText().length()<=maxLength &&  jft.getText().length()>=minLength);
            FieldInputVerifier.valid=a;
            if(!a)
            {
             //  JOptionPane.showMessageDialog(null,msg );
            }
            return a;
        }
    quella joptionpane che adesso ho commentato, ho aggiunto la variabile booleana di tipo statico che viene settata al valore che verrà poi restitituito al metodo verify. Tale valore lo vado poi a verificare quando premo il bottone . Se vero allora avvio la ricerca perchè significa che nella jformat è stato inserito un valore valido altrimenti stampo un messaggio.
    Quello che adesso vorrei chiedere è perchè quella JoptionPane nel verifier mi crea questo problema? penso sia qualcosa legato all evt thread ma non riesco a capire !!

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    Mi dispiace ti sbagli se vedi bene il codice sollevo un eccezione ArrayIndexOutOfBoundsException !!
    E' vero, non avevo visto il try / catch... del resto, non sono abituato a far sollevare eccezioni quando non necessario: sono abituato a "prevenirle" ed evitarle, almeno quelle banali come la ArrayIndexOutOfBoundsException.


    Quote Originariamente inviata da linux_r Visualizza il messaggio
    Allora il problema è :
    codice:
     public boolean verify(JComponent input) {
            boolean a;
            Pattern p=Pattern.compile(regex);
            JFormattedTextField jft=(JFormattedTextField)input;
            a=(Pattern.matches(p.toString(),jft.getText()) && jft.getText().length()<=maxLength &&  jft.getText().length()>=minLength);
            FieldInputVerifier.valid=a;
            if(!a)
            {
             //  JOptionPane.showMessageDialog(null,msg );
            }
            return a;
        }
    quella joptionpane che adesso ho commentato, ho aggiunto la variabile booleana di tipo statico che viene settata al valore che verrà poi restitituito al metodo verify. Tale valore lo vado poi a verificare quando premo il bottone . Se vero allora avvio la ricerca perchè significa che nella jformat è stato inserito un valore valido altrimenti stampo un messaggio.
    Quello che adesso vorrei chiedere è perchè quella JoptionPane nel verifier mi crea questo problema? penso sia qualcosa legato all evt thread ma non riesco a capire !!

    Sì: L'InputVerifier non dovrebbe occuparsi di notificare nulla all'utente. E' un verificatore: dovrebbe limitarsi a porre un veto (dire "Sì", oppure "No") rispetto a quanto digitato dall'utente. E lo fa attraverso il valore booleano di ritorno. Se l'input fornito soddisfa il controllo, si passa oltre, altrimenti semplicemente non si accetta l'input (e, se guardi bene, c'è un metodo chiamato "shouldYeldFocus()" che dice al sistema se la TextField deve mantenere il focus oppure no, proprio in base al valore di ritorno di verify() ).

    Se guardi la documentazione del metodo verify(), ci trovi scritto:

    Checks whether the JComponent's input is valid. This method should have no side effects.
    La parte che ho messo in grassetto è la chiave: questo metodo NON dovrebbe avere effetti "visivi" per l'utente... ed è abbastanza facile capire perchè, se si sa cosa fa un InputVerifier: deve solo verificare se l'input è corretto o meno, influenzando il focus del componente. Se l'input è corretto, il componente può perdere il focus (quindi, l'utente può "uscire dal campo"), altrimenti deve detenere il focus finchè l'input non sarà corretto. Questo ha particolari influenze proprio sul EDT.


    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

  9. #9
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Qualche suggerimento.
    Usa meglio le variabili togliendo quelle inutili (a, jtf...) e mettendone altre che semplificano la comprensione del codice.
    "a" e "p" sono dei pessimi nomi, non dicono nulla su cosa rappresentano. "input" non da l'idea di essere un componente di input ma l'input stesso...

    Esempio, scritto al volo:

    codice:
    public boolean verify(JComponent component) 
    {
        Pattern pattern = Pattern.compile(regex);
        String text = ((JFormattedTextField) component).getText();
        
        return Pattern.matches(pattern.toString(), text) 
            && text.length() <= maxLength 
            && text.length() >= minLength;
    }
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    ho utilizzato un documentListener e ho risolto il problema

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.