每次更改JPasswordField中的文本时调用方法

时间:2012-02-19 23:26:26

标签: java swing jpasswordfield

- 编辑 -
我有一个JTextField,我希望每当有人更改(输入或删除)JTextField中的一个字符时调用一个方法(现在就让它只是print语句)。其背后的目的是该方法立即检查输入的内容是否满足某些条件。感谢您的帮助,我设法写道:

public class MyDocumentListener implements DocumentListener {

    public void insertUpdate(DocumentEvent e) {
        updateLog(e, "inserted into");
    }
    public void removeUpdate(DocumentEvent e) {
        updateLog(e, "removed from");
    }
    public void changedUpdate(DocumentEvent e) {
        //Plain text components do not fire these events
    }

    public void updateLog(DocumentEvent e, String action) {
        System.out.println("should call the method here");
    }
}

JTextField代码:

    JTextField passwordField = new JTextField();
    passwordField.getDocument().addDocumentListener(new MyDocumentListener());
    passwordField.getDocument().putProperty("name", "Text Field");

我现在遇到的问题是我需要使用

String textFieldPassword = passwordField.getText();

但它会返回NullPointerException。我假设这是因为我添加了DocumentListener,现在应该在DocumentEvent上运行。但我真的不知道怎么做。

2 个答案:

答案 0 :(得分:2)

您需要该字段的动作侦听器:

public class YourClass extends JPanel implements ActionListener {

    public void addComponents() {
        ...
        passwordField.addActionListener(this);
        ...
    }

    /**
      will be fired when the password field changes
    */
    public void actionPerformed(ActionEvent evt) {
        String text = passwordField.getText();
        System.out.println("key pressed");
    }
}

如果这不符合您的口味,那么您可以尝试DocumentListener

答案 1 :(得分:0)

这就是我最终的目的(当两个密码匹配时启用一个按钮):

public class ChangePasswordUI implements DocumentListener, ActionListener {
    private JFrame frame;
    private JPasswordField newPassword1 = new JPasswordField(20);
    private JPasswordField newPassword2 = new JPasswordField(20);
    private JButton OKbutton;

    protected ChangePasswordUI() {
        OKbutton.addActionListener(this);
        newPassword1.addActionListener(this);
        newPassword2.addActionListener(this);
        newPassword1.getDocument().addDocumentListener(this);
        newPassword2.getDocument().addDocumentListener(this);

        frame = new JFrame();
        frame.add(newPassword1);
        frame.add(newPassword2);
        frame.pack();
        updateOKbutton();
        frame.setVisible(true);
    }

    private void updateOKbutton() {
        if(Arrays.equals(newPassword1.getPassword(),newPassword2.getPassword()) == false) {
            OKbutton.setEnabled(false);
        } else {
            OKbutton.setEnabled(true);
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == cancelButton) {
            frame.dispose();
        } else if (e.getSource() == OKbutton) {
            frame.dispose();
        } else if (e.getSource() == newPassword1) {
            updateOKbutton();
        } else if (e.getSource() == newPassword2) {
            updateOKbutton();
        }
    }

    @Override
    public void changedUpdate(DocumentEvent e) {
        updateOKbutton();
    }

    @Override
    public void insertUpdate(DocumentEvent e) {
        updateOKbutton();
    }

    @Override
    public void removeUpdate(DocumentEvent e) {
        updateOKbutton();
    }
}

注意:

  • 示例代码是我正在使用的“设置新密码”对话框的精简版本,而JFrame的东西可能完全是躲闪的(我使用的是混乱的GridBagLayout()东西而且没人想看到那个)
  • .getText()方法现已过时(您想使用.getDocument())。
  • actionListener对于密码字段几乎没有用(但可能需要其他用途,所以为什么不包括密码!)