Как я могу добавить столбец изображения в таблицу в структуре калитки?

Я хочу добавить столбец, содержащий изображения, в каждую ячейку таблицы в рамках калитки. Я создаю таблицу в классе java и использую метод createColumns() следующим образом:

private List<IColumn> createColumns() {
    List<IColumn> columns = new ArrayList<IColumn>();
    // Create the columns that will be displayed, second param is the sort
    // order
    // Use column position for aggregate functions
    // Otherwise the query uses column aliases so these need to match here

    columns.add(new PropertyColumn(new Model("Status"), "code") {
        private static final long serialVersionUID = 1L;
        @Override
        public void populateItem(Item item, String componentId, IModel model) {
            Object[] values = ((ArrayWrapper) model.getObject()).getArray();
            setStatus((Integer) values[0]);
            item.add(new Image(componentId, new ResourceReference(this.getClass(), getStatus())));
        }
    });

    columns.add(new PropertyColumn(new Model("First"), "2", "array[1]"));
    columns.add(new PropertyColumn(new Model("Last"), "3", "array[2]"));        
    columns.add(new PropertyColumn(new Model("Sender"), "sender",
            "array[4]"));
    columns.add(new PropertyColumn(new Model("Receiver"), "receiver",
            "array[5]"));

    columns.add(new HeaderlessColumn() {
        private static final long serialVersionUID = 1L;

        public void populateItem(Item cellItem, String componentId,
                IModel rowModel) {
            cellItem.add(new ActionPanel(componentId, rowModel));
        };
    });

    return columns;
}

HTML-файл выглядит следующим образом:

<html xmlns:wicket="http://wicket.sourceforge.net/">
<body>
<wicket:extend>
 <table align="center" wicket:id="results"></table>
</wicket:extend>
</body>
</html>

Но я получаю исключение, которое:

org.apache.wicket.markup.MarkupException: ячейка компонента должна применяться к тегу типа img, а не '' (строка 0, столбец 0)

И это связано с линиями, которые я делаю столбцом для изображения. Может ли кто-нибудь помочь мне, как я могу это сделать?


person Noushin Khaki    schedule 29.09.2011    source источник


Ответы (2)


Используйте AbstractColumn< /a> вместо PropertyColumn. PropertyColumn подходит, если вам нужно указать только имя свойства, как вы сделали бы с PropertyModel.

Из этого обсуждения в список пользователей калитки, DataTable выводит следующую разметку:

<tbody> 
  <tr wicket:id="rows"> 
    <td wicket:id="cells"> 
      <span wicket:id="cell">[cell]</span> 
    </td> 
  </tr> 
</tbody> 

Обратите внимание, что IColumn реализует ICellPopulator, и именно ICellPopulator#populateItem() переопределяется в AbstractColumn.

Итак, все, что вы придумали в populateItem, должно быть в порядке, если связано с <span> в разметке. PropertyColumn может делать это с меткой, и вы должны добавить пользовательский Panel или WebMarkupContainer, который будет содержать ваш Image.

Это немного связанный вопрос: Как сделать ссылку внутри PropertyColumn в Wicket?

person Xavi López    schedule 29.09.2011
comment
@NoushinKhaki Рад, что это сработало. Не забудьте проголосовать за полезные ответы и принять тот, который вы считаете лучшим. - person Xavi López; 29.09.2011

Код в методе CreateColumns выглядит следующим образом:

   columns.add(new PropertyColumn(new Model("Status"), "code") {
        private static final long serialVersionUID = 1L;
        @Override
        public void populateItem(Item item, String componentId, IModel model) {
            Object[] values = ((ArrayWrapper) model.getObject()).getArray();
            setStatus((Integer) values[0]);
            item.add(new ImagePanel(componentId, new ResourceReference(SearchResults.class, getStatus())));
        }
    });

А это ImagePanel:

 public class ImagePanel extends Panel {
    private static final long serialVersionUID = 1L;
    /**
     * @param id
     */
    public ImagePanel(String id, ResourceReference image) {
        super(id);
        add(new Image("status", image));
    }
}

HTML-код панели:

<html xmlns:wicket="http://wicket.sourceforge.net/">
<body>
<wicket:panel>
<img wicket:id="status"/>
</wicket:panel>
</body>
</html>
person Noushin Khaki    schedule 05.10.2011
comment
Здесь нет смысла использовать PropertyColumn. Второй параметр, который вы передаете как propertyName, бесполезен, потому что вы в любом случае переопределяете единственный метод, который его использует, populateItem() (это единственное расширение, которое PropertyColumn предоставляет для AbstractColumn), и, следовательно, переопределяете всю цель PropertyColumn. Вы должны использовать AbstractColumn. - person Xavi López; 07.10.2011