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

时间:2011-04-17 17:37:48

标签: java wicket

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中有可能吗?

3 个答案:

答案 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)

简单的答案是:不要使用嵌套的匿名类。无论如何,阅读和维护都是绝对的噩梦。根据经验,如果您的类在方法体中具有两个以上的方法或超过五行代码,那么最好使它成为正确的命名类。