我看了一遍,每个人都说,当你想听 aJTextField
或其他摆动文本组件的文本更改时,请DocumentListener
在基础文档上使用 a。但这对我没有帮助,因为我需要知道正在使用文档的组件,并且需要对其采取行动。知道是什么文档触发了它,DocumentEvent
但事件,也不知道文档,知道“父”组件是什么。IIRC,这是因为给定文档可能有多个“父级”。这是我想要完成的一个例子。
JTextField txtOne = new JTextField();
JTextField txtTwo = new JTextField();
etc...
KeyListener validator = new KeyListener(){
public void updateComponent(KeyEvent e) {
//The line below CAN be accomplished with a docuement listener
//by grabbing the text of the document.
boolean valid = validationMethod(((JTextField) e.getSource()).getText());
if (valid) {
//This CANNOT be accomplished with a document listener because
//the document doesn't know what component is using it.
((JTextField) e.getSource()).setEnabled(true);
} else {
((JTextField) e.getSource()).setEnabled(false);
}
}
public void keyPressed(KeyEvent e) {updateComponent(e);}
public void keyReleased(KeyEvent e) {updateComponent(e);}
public void keyTyped(KeyEvent e) {updateComponent(e);}
};
txtOne.addKeyListener(validator);
txtTwo.addKeyListener(validator);
etc...
当文本更改事件来自键盘交互时,上述方法非常有用。但如果我这样做txtTwo.setText("asdfasdf");
,它不会向那个听众发射任何东西。使用 anActionListener
更糟糕,因为它只在大多数情况下按下 enter 键时触发。使用 aDocumentListener
至少会捕获每个文本更改,但似乎也不起作用,除非我遗漏了什么。
JTextField txtOne = new JTextField();
JTextField txtTwo = new JTextField();
etc...
DocumentListener validator = new DocumentListener() {
public void updateComponent(DocumentEvent e) {
boolean valid = validationMethod(e.getDocument().getText(0,
e.getDocument().getLength()));
if (valid) {
//The event has no getSource, only getDocument. The document likewise
//has no idea what the component is that is using this document.
((JTextFieldWithLabel) e.getSource()).setEnabled(true); //won't work
} else {
//no idea what i could do here....
((JTextFieldWithLabel) e.getSource()).setEnabled(false); //won't work
}
}
public void removeUpdate(DocumentEvent e) {updateComponent(e);}
public void insertUpdate(DocumentEvent e) {updateComponent(e);}
public void changedUpdate(DocumentEvent e) {updateComponent(e);}
};
txtOne.getDocument().addDocumentListener(validator);
txtTwo.getDocument().addDocumentListener(validator);
etc...
我需要共享一个监听器,因为最终会有数百个组件可能使用这个监听器及其功能。我不会将它复制数百次并将每个硬编码到特定组件。