2012-12-25 9 views
5

C'è un modo per convalidare un numero di JTextfields in java senza la struttura if else. Ho un insieme di 13 campi, voglio un messaggio di errore quando non viene data alcuna voce per nessuno dei 13 campi e poter essere in grado di focalizzare su quella particolare casella di testo. questo è per impedire agli utenti di inserire dati vuoti nel database. qualcuno potrebbe mostrarmi come questo può essere ottenuto senza la struttura if else come sotto.Convalida stringa vuota per più JTextfield

if (firstName.equals("")) { 
    JOptionPane.showMessageDialog(null, "No data entered"); 
} else if (lastName.equals("")) { 
    JOptionPane.showMessageDialog(null, "No data entered"); 
} else if (emailAddress.equals("")) { 
    JOptionPane.showMessageDialog(null, "No data entered"); 
} else if (phone.equals("")) { 
    JOptionPane.showMessageDialog(null, "No data entered"); 
} else { 
//code to enter values into MySql database 

il codice sopra riportato sotto il metodo actionperformed a di un pulsante di registrazione di invio. nonostante l'impostazione dei campi in MySQL come NOT NULL, la stringa vuota veniva accettata dalla GUI java. perchè è questo? speravo forse che potesse essere generata un'eccezione di stringhe vuota da cui avrei potuto personalizzare un messaggio di convalida, ma non ero in grado di farlo perché venivano accettati i campi vuoti.

Grazie

+1

uso 'DocumentListener', e di cambiare' Sfondo Color' invece di utilizzo di '' JOptionPane' – mKorbel

risposta

2

Ecco un modo per farlo:

public static boolean areAllNotEmpty(String... texts) 
{ 
    for(String s : texts) if(s == null || "".equals(s)) return false; 
    return true; 
} 

// ... 

if(areAllNotEmpty(firstName, lastName, emailAddress, phone)) 
{ 
    JOptionPane.showMessageDialog(null, "No data entered"); 
} 
+0

"" .equals (s) 'hmmm ternario – mKorbel

+0

@mKorbel Cosa intendi? :) –

+0

'" ".equals (s)' potrebbe essere utile, è nullo dovrebbe essere ignorato – mKorbel

4

accettano un array di questi tre JTextField, sto dando una panoramica

JTextField[] fields = new JTextField[13] 
field[0] = firstname; 
field[1] = lastname; //then add remaining textfields 

for(int i = 0; i < fields.size(); ++i) { 
if(fields[i].getText().isEmpty()) 
    JOptionPane.showMessageDialog(null, "No data entered"); 
} 

correggermi se sono sbagliato, non ho familiarità con Swing o awt.HTH :)

+0

hai ragione.:-) – vels4j

+0

@MuminAli niente con privato, stai usando fuori da quella classe? –

+0

field = {firstname, lastname ...}; è illegale l'inizio dell'espressione. poiché firstname, lastname non sono di tipo Jtextfield [], richiedono swing.Jtextfield [], trovato swing JTextfield. – Hoody

4

Ci sono diversi modi per farlo s, uno è

JTextField[] txtFieldA = new JTextField[13] ; 
txtFieldFirstName.setName("First Name") ; //add name for all text fields 
txtFieldA[0] = txtFieldFirstName ; 
txtFieldA[1] = txtFieldLastName ; 
.... 

// in action event 
for(JTextField txtField : txtFieldA) { 
    if(txtField.getText().equals("")) { 
     JOptionPane.showMessageDialog(null, txtField.getName() +" is empty!"); 
     //break it to avoid multiple popups 
     break; 
    } 
} 

Inoltre si prega di dare un'occhiata a JGoodies Validation tale contesto aiuta a convalidare l'input dell'utente in applicazioni Swing e vi assiste nella segnalazione errori di convalida e gli avvisi.

+1

+1 per JGoodies – kleopatra

+0

@kleopatra Grazie – vels4j

6

Solo per divertimento un po 'di spasmi delle dita che dimostra una configurazione di convalida riutilizzabile che utilizza le funzionalità disponibili nel core Swing.

I collaboratori:

  • InputVerifier che contiene la logica di convalida. Qui viene semplicemente verificato il testo vuoto nel campo in verifica. Si noti che
    • verificare non deve avere effetti collaterali
    • shouldYieldFocus è sottoposto a override di non limitare l'attenzione attraversamento
    • è la stessa istanza per tutti i campi di testo
  • un commit azione che controlla la validità di tutti figli del suo genitore invocando esplicitamente l'inputVerifier (se presente) e semplicemente non fa nulla se non è valido
  • un meccanismo per un messaggio di errore molto semplice sebbene generalmente disponibile prendendo l'etichetta del campo di input

Alcuni frammenti di codice

// a reusable, shareable input verifier 
InputVerifier iv = new InputVerifier() { 

    @Override 
    public boolean verify(JComponent input) { 
     if (!(input instanceof JTextField)) return true; 
     return isValidText((JTextField) input); 
    } 

    protected boolean isValidText(JTextField field) { 
     return field.getText() != null && 
       !field.getText().trim().isEmpty(); 
    } 

    /** 
    * Implemented to unconditionally return true: focus traversal 
    * should never be restricted. 
    */ 
    @Override 
    public boolean shouldYieldFocus(JComponent input) { 
     return true; 
    } 

}; 
// using MigLayout for lazyness ;-) 
final JComponent form = new JPanel(new MigLayout("wrap 2", "[align right][]")); 
for (int i = 0; i < 5; i++) { 
    // instantiate the input fields with inputVerifier 
    JTextField field = new JTextField(20); 
    field.setInputVerifier(iv); 
    // set label per field 
    JLabel label = new JLabel("input " + i); 
    label.setLabelFor(field); 
    form.add(label); 
    form.add(field); 
} 

Action validateForm = new AbstractAction("Commit") { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     Component source = (Component) e.getSource(); 
     if (!validateInputs(source.getParent())) { 
      // some input invalid, do nothing 
      return; 
     } 
     System.out.println("all valid - do stuff"); 
    } 

    protected boolean validateInputs(Container form) { 
     for (int i = 0; i < form.getComponentCount(); i++) { 
      JComponent child = (JComponent) form.getComponent(i); 
      if (!isValid(child)) { 
       String text = getLabelText(child); 
       JOptionPane.showMessageDialog(form, "error at" + text); 
       child.requestFocusInWindow(); 
       return false; 
      } 
     } 
     return true; 
    } 
    /** 
    * Returns the text of the label which is associated with 
    * child. 
    */ 
    protected String getLabelText(JComponent child) { 
     JLabel labelFor = (JLabel) child.getClientProperty("labeledBy"); 
     return labelFor != null ? labelFor.getText() : ""; 
    } 

    private boolean isValid(JComponent child) { 
     if (child.getInputVerifier() != null) { 
      return child.getInputVerifier().verify(child); 
     } 
     return true; 
    } 
}; 
// just for fun: MigLayout handles sequence of buttons 
// automagically as per OS guidelines 
form.add(new JButton("Cancel"), "tag cancel, span, split 2"); 
form.add(new JButton(validateForm), "tag ok"); 
+0

@Reimeus InputVerifier non è una cattiva idea - basta non limitare focusTraversal e usarlo come regola per convalidare un componente :-) – kleopatra