Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向ListView添加删除链接-如何从内部匿名类引用外部匿名类_Java_Wicket - Fatal编程技术网

Java 向ListView添加删除链接-如何从内部匿名类引用外部匿名类

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; /**

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;

        /**
         * @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();
             }
         });
    }
});