2015-04-20 12 views
6

Mam formularz logowania, w którym użytkownik może wprowadzić swoje dane logowania, aby się zalogować. Mam JLabel, który służy do wyświetlania tekstu informującego użytkownika o tym, że nazwa użytkownika nie może być pusta. Ta etykieta jest wyświetlana po kliknięciu przez użytkownika przycisku logowania, gdy pole tekstowe jest puste.Obsługa zdarzeń edycji w JTextField

Chcę, aby w momencie, w którym użytkownik zaczyna pisać w polu tekstowym, etykieta z informacją powinna zniknąć. Jak mogę to osiągnąć?

Oto kod:

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

Odpowiedz

4

do tego celu trzeba użyć DocumentListener na twoim JTextField, tutaj jest tutorial.

jak np

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 musi final (Java mniejsze niż 8, w wersji).

Również na początku twoje pole jest puste, więc może być konieczne użycie setVisible(true) na etykiecie error.

+0

Myśl upvoted odpowiedź, ale dlaczego 'error' musi być ostateczna dla' Java 1.7 i below' Zamiast 'błąd JLabel' powinna być zmienna instancji , aby uniknąć, ponieważ jest "ostateczny" –

+0

@ nIcEcOw niższa niż 8 wersji, w 1.8 może nie być ostateczna. W wersjach niższych musi być ona ostateczna, ponieważ jest zmienną lokalną lub zadeklarowana jako zmienna instancji – alex2410

+0

Zmienna "final" jest potrzebna z jakiegoś powodu, ale nie w celu opisanym w tym poście. Jeśli 'error JLabel' jest zmienną instancji, wtedy nie ma potrzeby deklarowania jej jako' final'. –

5

Musisz utworzyć 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); 
     } 
    }; 

następnie dla pól tekstowych:

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

Możesz dodać KeyListener na wejściu złożony

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

Nie widzę problemu z moim rozwiązaniem. Czy ktokolwiek może mnie oświecić – Saif

+0

Istnieją klucze, które nie będą wprowadzać znaków do pola, ale akcja odbiornika kluczy będzie się nazywała – Kuba

+0

Downvote do używania 'KeyListener'. W takim przypadku musisz użyć 'DocumentListener'. – alex2410

Powiązane problemy