Добавить ссылку удаления в ListView - как ссылаться на внешний анонимный класс из внутреннего анонимного класса - PullRequest
2 голосов
/ 17 апреля 2011

Wicket ListView предоставляет removeLink для добавления с ListItem. Реализация метода removeLink в источнике класса ListView:

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 ]

4 голосов
/ 17 апреля 2011

Вы можете использовать Component.findParent(class):

ListView<?> listView = findParent(ListView.class);
listView.modelChanged();
listView.removeAll();

Или вы можете просто позвонить super.onClick() в вашем onClick() методе.

2 голосов
/ 18 апреля 2011

Я полагаю, что приведенный ниже код будет работать - объявленные переменные доступны из внутреннего класса, если они объявлены как 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();
             }
         });
    }
});
0 голосов
/ 18 апреля 2011

Простой ответ: не используйте вложенные анонимные классы. Они - абсолютный кошмар, чтобы читать и поддерживать в любом случае. Как правило, если в вашем классе должно быть более двух методов или более пяти строк кода в теле методов, лучше сделать его правильным, именованным классом.

...