2015-04-20 10 views
6

Ich habe ein Login-Formular, wo ein Benutzer seine Anmeldeinformationen eingeben können, um sich anzumelden. Ich habe eine JLabel, die dazu dient, den Text anzuzeigen, der dem Benutzer sagt, dass der Benutzername nicht leer sein darf. Dieses Label wird angezeigt, nachdem ein Benutzer auf die Anmeldeschaltfläche geklickt hat, wenn das Textfeld leer ist.Bearbeiten von Bearbeitungsereignissen in einem JTextField

Ich möchte, dass in dem Moment, in dem der Benutzer beginnt, in das Textfeld einzugeben, die Beschriftung mit den Informationen verschwinden sollte. Wie erreiche ich dieses Verhalten? Hier

ist der Code:

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(); 
     } 
    }); 
} 
} 

Antwort

4

Zu diesem Zwecke müssen Sie DocumentListener verwenden auf Ihrem JTextField, hier ist tutorial.

Als Beispiel:

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 muss final (für Java niedriger als 8-Version) sein.

Auch bei Start ist Ihr Feld leer, so müssen möglicherweise setVisible(true) auf error Label verwendet werden.

+0

Thought upvoted die Antwort eingereicht hinzufügen können, aber warum 'error' hat für' Java 1.7 und die nachstehend erläuterte Stattdessen endgültig sein, 'Fehler JLabel' sollte Instanz variabel sein Um dies zu vermeiden, ist es "final" –

+0

@nIcEcOw niedriger als 8 Version, in 1.8 kann es nicht endgültig sein. In niedrigeren Versionen muss es endgültig sein, da es sich um eine lokale Variable handelt, oder als Instanzvariable deklariert – alex2410

+0

'final'-Variable wird aus einem bestimmten Grund benötigt, aber nicht für den in diesem Beitrag beschriebenen Zweck. Wenn "Fehler JLabel" die Instanzvariable ist, muss sie nicht als "final" deklariert werden. –

5

Sie haben erstellen 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); 
     } 
    }; 

dann für Textfelder:

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

Sie einen keyListener im Eingangs

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

Ich sehe das Problem mit meiner Lösung nicht. Kann mir jemand freundlich erleuchten – Saif

+0

Es gibt Tasten, die nicht Zeichen Feld eingeben, aber Schlüssel Hörer Aktion wird – Kuba

+0

Downvote für die Verwendung von 'KeyListener' aufgerufen werden. In diesem Fall müssen Sie 'DocumentListener' verwenden. – alex2410