- 编辑 -
我有一个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
上运行。但我真的不知道怎么做。
答案 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
对于密码字段几乎没有用(但可能需要其他用途,所以为什么不包括密码!)