2015-04-20 19 views
6

Ho un modulo di accesso in cui un utente può inserire le sue credenziali per accedere. Ho un JLabel che serve per visualizzare il testo che dice all'utente che il nome utente non può essere vuoto. Questa etichetta viene visualizzata dopo che un utente fa clic sul pulsante di accesso quando il campo di testo è vuoto.Gestione degli eventi di modifica in un JTextField

Voglio che nel momento in cui l'utente inizia a digitare nel campo di testo l'etichetta con le informazioni dovrebbe scomparire. Come posso ottenere questo comportamento?

Ecco il codice:

public class JTextFiledDemo { 

private JFrame frame; 

JTextFiledDemo() { 
    frame = new JFrame(); 
    frame.setVisible(true); 
    frame.setSize(300, 300); 
    frame.setLayout(new GridLayout(4, 1)); 
    frame.setLocationRelativeTo(null); 
    iniGui(); 
} 

private void iniGui() { 

    JLabel error = new JLabel(
      "<html><font color='red'> Username cannot be empty!<></html>"); 

    error.setVisible(false); 
    JButton login = new JButton("login"); 
    JTextField userName = new JTextField(10); 

    frame.add(userName); 
    frame.add(error); 
    frame.add(login); 
    frame.pack(); 

    login.addActionListener((ActionEvent) -> { 
     if (userName.getText().equals("")) { 
      error.setVisible(true); 
     } 
    }); 

} 

public static void main(String[] args) { 

    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      JTextFiledDemo tf = new JTextFiledDemo(); 
     } 
    }); 
} 
} 

risposta

4

Per questo scopo è necessario utilizzare DocumentListener sul tuo JTextField, ecco tutorial.

Come esempio:

userName.getDocument().addDocumentListener(new DocumentListener() { 
    @Override 
    public void insertUpdate(DocumentEvent de){ 
     event(de); 
    } 

    @Override 
    public void removeUpdate(DocumentEvent de) { 
     event(de); 
    } 

    @Override 
    public void changedUpdate(DocumentEvent de){ 
     event(de); 
    } 

    private void event(DocumentEvent de){ 
     error.setVisible(de.getDocument().getLength() == 0); 
     // as mentioned by nIcE cOw better to use Document from parameter 
     frame.revalidate(); 
     frame.repaint(); 
    } 
}); 

error deve essere final (per java inferiore 8 versione).

Inoltre all'inizio il campo è vuoto, quindi potrebbe essere necessario utilizzare setVisible(true) sull'etichetta error.

+0

Pensiero upvoted la risposta, ma perché 'error' deve essere finale per' Java 1.7 e below' Invece, 'errore JLabel' dovrebbe essere variabile di istanza , per evitare, essendo 'final' –

+0

@nIcEcOw inferiore alla versione 8, in 1.8 potrebbe non essere definitivo. Nelle versioni inferiori deve essere finale perché è una variabile locale o dichiarata come variabile di istanza – alex2410

+0

La variabile 'final' è necessaria per un motivo, ma non per lo scopo che hai descritto in questo post. Se 'error JLabel' è la variabile di istanza, non è necessario dichiararlo come' final'. –

5

È necessario creare DocumentListener:

DocumentListener dl = new DocumentListener() 
    { 
     @Override 
     public void insertUpdate(DocumentEvent de) 
     { 
      error.setVisible(false); 
     } 

     @Override 
     public void removeUpdate(DocumentEvent de) 
     { 
      // 
     } 

     @Override 
     public void changedUpdate(DocumentEvent de) 
     { 
      error.setVisible(false); 
     } 
    }; 

poi per i vostri campi di testo:

login.getDocument().addDocumentListener(dl); 
0

È possibile aggiungere un keyListener nella immissione di file

userName.addKeyListener(new KeyListener() { 

    @Override 
    public void keyTyped(KeyEvent arg0) { 

    } 

    @Override 
    public void keyReleased(KeyEvent arg0) { 

    } 

    @Override 
    public void keyPressed(KeyEvent arg0) { 
     error.setVisible(false); 
    } 
}); 
+0

non vedo il problema con la mia soluzione. Qualcuno mi può illuminare gentilmente – Saif

+0

Ci sono dei tasti, che non inseriranno il carattere in campo, ma l'azione del listener dei tasti sarà chiamata – Kuba

+0

Downvote per l'uso di 'KeyListener'. In tal caso è necessario utilizzare 'DocumentListener'. – alex2410

Problemi correlati