以下代码将侦听器添加到几个SWT Text元素。唯一的区别是Listeners方法中的代码。有没有一种方法可以通过找到正确的动态使用方法来减少此代码的重复性?
在此示例中,使用了FocusListener,但这并不相关。
private void addFocusLostListeners() {
nameText.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {}
@Override
public void focusLost(FocusEvent e) {
myDataObject.setName(nameText.getText());
}
});
ageText.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {}
@Override
public void focusLost(FocusEvent e) {
myDataObject.setAge(ageText.getText());
}
});
emailText.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {}
@Override
public void focusLost(FocusEvent e) {
myDataObject.setEmail(emailText.getText());
}
});
...
}
答案 0 :(得分:4)
您可以创建一个辅助方法(您需要将TextField
替换为nameText
,ageText
等实际类):
private static void addFocusListener(TextField field, Consumer<? super String> setter) {
field.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {}
@Override
public void focusLost(FocusEvent e) {
setter.accept(field.getText());
}
});
}
然后您可以致电:
private void addFocusLostListeners() {
addFocusListener(nameText, myDataObject::setName);
addFocusListener(ageText, myDataObject::setAge);
addFocusListener(emailText, myDataObject::setEmail);
}