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

您必须创建 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);
为此,

您需要在JTextField上使用DocumentListener,这是教程。

例如:

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(对于低于 8 版本的 Java)。

同样在开始时,您的字段为空,因此可能需要在标签上使用error setVisible(true)

您可以在输入文件中添加 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);
    }
});

最新更新