JTextField
私はいろいろ調べましたが、 やその他のスイング テキスト コンポーネントのテキストの変更を聞きたいときはDocumentListener
、基になるドキュメントで を使用すると誰もが言います。ドキュメントを使用しているコンポーネントを知り、それに基づいて行動する必要があるため、これは役に立ちません。は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");
たとしても、そのリスナーには何も発火しません。ActionListener
ほとんどの場合、Enter キーが押されたときにのみ起動するため、を使用するとさらに悪化します。a を使用するDocumentListener
と、少なくともすべてのテキストの変更がキャプチャされますが、何かが欠けていない限り、どちらも機能しないようです。
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...
リスナーを共有する必要があるのは、最終的に、このリスナーとその関数を潜在的に使用できるコンポーネントが何百もあるからです。何百回もコピーパスタして、それぞれを特定のコンポーネントにハードコーディングするつもりはありません。