Java 向ListView添加删除链接-如何从内部匿名类引用外部匿名类
Wicket ListView提供要与ListItem一起添加的removeLink。ListView类源中removeLink方法的实现为:Java 向ListView添加删除链接-如何从内部匿名类引用外部匿名类,java,wicket,Java,Wicket,Wicket ListView提供要与ListItem一起添加的removeLink。ListView类源中removeLink方法的实现为: public final Link removeLink(final String id, final ListItem item) { return new Link(id) { private static final long serialVersionUID = 1L; /**
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中使用?您可以使用:
ListView-ListView=findParent(ListView.class);
modelChanged();
removeAll();
或者您可以在
onClick()
方法中调用super.onClick()
。简单的答案是:不要使用嵌套的匿名类。不管怎样,阅读和维护它们绝对是一场噩梦。根据经验,如果您的类在方法体中有两个以上的方法或五行以上的代码,最好使其成为一个适当的命名类。我相信下面的代码会起作用-声明的变量可以从内部类访问,只要它们声明为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();
}
});
}
});
你试过了吗?它编译了吗?@Ravi Wallau不,它没有编译。我在onClick()方法中尝试了这个.getParent()。但它失败了。而link extend AbstractLink进一步扩展了WebMarkupContainer,在super中没有onClick()方法。虽然Link的onClick()是抽象的。不是吗?如何调用super.onClick()?一般来说,从外部类的匿名内部类调用匿名外部类的方法(尽管它是内部的)怎么样?在Java中是可能的吗?@Tapas a)“它失败”是什么意思?这是一个标准的方法,它总是有效的。b)关于超级,我的错误,我以为你在过度使用removeLink()1)对不起我的错误。因为我尝试了这个返回ListItem的.getParent(),所以现在我做了(ListView)这个.getParent().getParent(),它成功了。另外(ListView)this.findParent(ListView.class)运行良好。所以他们俩都工作了。谢谢2) 关于我在第一篇文章中给出的代码片段,我有一个问题。调用listView.removeAll()需要什么。将stateChange添加到Link之后,我们调用了ListItem.modelChanging(),然后删除该项并调用modelChanged(),removeAll()有什么用途?3) 是什么让页面重新加载的?谢谢。@Tapas请:评论中没有问题。问一个新问题,这个问题在很多情况下都是合理的,但对Wicket来说是不切实际的。简单组件(如文本占位符或表单组件)的行为通常由父类的重写方法定义。如果要为每一个类创建一个合适的类,即使是简单的页面,也会有几十个类。我在Swing中也使用匿名内部类。我同意匿名类不应该被过度使用,但是像wicket这样的基于侦听器的框架变成了一场噩梦,有100多个没有匿名类的琐碎类them@perilandmishap请注意,我并不是每次都说,也不是说你应该使用顶级课程。与命名的内部类相比,匿名内部类确实有一些优势,但是当您尝试做一些非琐碎的事情时,这些优势就消失了。谢谢。您提供的解决方案非常有效。所以我想通过这种方式,我们可以从内部匿名类调用外部匿名类的方法!不是吗?如果你可以选择像我一样声明变量,那么是的,这是一种有效的方法。
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();
}
});
}
});