Обработка событий редактирования в JTextField

у меня есть форма входа в систему, где пользователь может ввести свои учетные данные для входа. У меня есть JLabel, который служит для отображения текста, говорящее пользователю, что имя пользователя не может быть пустым. Эта метка отображается после нажатия пользователем кнопки входа в систему, когда текстовое поле пусто.

Я хочу, чтобы в тот момент, когда пользователь начнет вводить текстовое поле, метка с информацией должна исчезнуть.Как мне добиться такого поведения?

вот код:

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

3 ответов


для этого вам нужно использовать DocumentListener на JTextField здесь учебник.

например:

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 должно быть final(для java ниже 8 версии).

также при запуске ваше поле пусто, поэтому может потребоваться использовать setVisible(true) on error метки.


вы должны создать 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);
        }
    };

затем для текстовых полей:

login.getDocument().addDocumentListener(dl);

вы можете добавить keyListener во входной файл

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