Wicket ListView提供removeLink以添加ListItem。 ListView类源代码中removeLink方法的实现是:
public final Link removeLink(final String id, final ListItem item)
{
return new Link(id)
{
private static final long serialVersionUID = 1L;
/**
* @see org.apache.wicket.markup.html.link.Link#onClick()
*/
public void onClick()
{
addStateChange(new Change()
{
private static final long serialVersionUID = 1L;
final int oldIndex = getList().indexOf(item.getModelObject());
final Object removedObject = item.getModelObject();
public void undo()
{
getList().add(oldIndex, removedObject);
}
});
item.modelChanging();
// Remove item and invalidate listView
getList().remove(item.getModelObject());
ListView.this.modelChanged();
ListView.this.removeAll();
}
};
}
现在,如果我向ListItem添加一个链接并覆盖上面的onClick()方法并为其添加更多功能,我该如何重新定义这个片段:
ListView.this.modelChanged();
ListView.this.removeAll();
由于ListView对象的实例化由ListView的匿名类完成,对于链接也是如此。
add(new ListView("listId", list) {
protected void populateItem(ListItem item) {
item.add(new Link("linkId") {
public void onClick() {
// how can I define
// ListView.this.modelChanged();
// ListView.this.removeAll();
// here?
}
});
}
});
那是如何从内部匿名类引用外部匿名类?一般来说,从外部类的匿名内部类调用匿名外部类(虽然它是内部)的方法? Java中有可能吗?
答案 0 :(得分:4)
您可以使用Component.findParent(class)
:
ListView<?> listView = findParent(ListView.class);
listView.modelChanged();
listView.removeAll();
或者您可以在super.onClick()
方法中致电onClick()
。
答案 1 :(得分:2)
我相信下面的代码可以工作 - 声明的变量可以从内部类中访问,只要它们被声明为final,所以你可以声明一个包含ListView实例的变量并从内部类中使用它,就像我在以下示例。请注意,我没有编译此代码,但我认为没有理由不能使用它。请记住,必须将变量声明为final。
add(new ListView("listId", list) {
protected void populateItem(ListItem item) {
final ListView lv = this;
item.add(new Link("linkId") {
public void onClick() {
lv.modelChange();
lv.removeAll();
}
});
}
});
答案 2 :(得分:0)
简单的答案是:不要使用嵌套的匿名类。无论如何,阅读和维护都是绝对的噩梦。根据经验,如果您的类在方法体中具有两个以上的方法或超过五行代码,那么最好使它成为正确的命名类。