2013-12-05 5 views
0

У меня есть AjaxEditableLabelColumn с onChange метод. Мне нужно изменить цвет фона ячейки, которую я только что редактировал. Это код:Как изменить цвет ячейки AjaxEditableLabelColumn в Wicket

private AjaxEditableLabelColumn<User, String> createMyEditableColumn(String propertyExpression, boolean sortable) { 
    AjaxEditableLabelColumn<User, String> column = new AjaxEditableLabelColumn<User, String>(propertyExpression, sortable) { 
     private static final long serialVersionUID = 1L; 

     @Override 
     protected void onChange(AjaxRequestTarget target, IModel<User> model) { 

      User newRecord = model.getObject(); 

      if (newRecord.hasChanged()) { 
       if (newRecord.isRight()) { 
        ((((TURN GREEN)))) 
       } else { 
        ((((TURN RED))))) 
       } 

      } else { 
       ((((REMOVE COLOR)))) 
      } 
     } 

    }; 
    return column; 
} 
+1

Я не вижу, что это Калитка Класс: http://ci.apache.org/projects/wicket/apidocs/ 6.x/Что это? –

+0

Я думаю @ Mot4 сделал собственный класс, я прав? –

+0

Да, сделано мной. – Mot4

ответ

2

Я рекомендую вам скорее добавить поведение модификатора атрибута только один и изменить модель класса css или атрибута стиля.

КОД:

private AjaxEditableLabelColumn<User, String> createMyEditableColumn(String propertyExpression, boolean sortable) { 

     final IModel<String> cssModel = Model.of("bkg-default"); 
     AjaxEditableLabelColumn<User, String> column = new AjaxEditableLabelColumn<User, String>(propertyExpression, sortable) { 

     private static final long serialVersionUID = 1L; 

      @Override 
      protected void onChange(AjaxRequestTarget target, IModel<User> model) { 

       User newRecord = model.getObject(); 

       if (newRecord.hasChanged()) { 
        if (newRecord.isRight()) { 
         cssModel.setObject("bkg-green"); 
        } else { 
         cssModel.setObject("bkg-red"); 
        } 
       } else { 
        cssModel.setObject("bkg-default"); 
       } 
      } 
      // The following line is unnccessary if you already add 
      // component for to be render in AjaxEditableLabelColumn 
      target.add(this); 

     }; 
     column.add(new AttributeModifier("css", cssModel)); 
     return column; 
    } 

CSS:

.bkg-default { background-color: transparent; } 
.bkg-green { background-color: green; } 
.bkg-red { background-color: red; } 
0

Самым простым решением было бы добавить AttributeModifier в ячейку и обновить его. AjaxEditableLabelColumn выглядит пользовательской реализации, так что я угадал немного:

 @Override 
     protected void onChange(AjaxRequestTarget target, IModel<User> model) { 

      User newRecord = model.getObject(); 

      if (newRecord.hasChanged()) { 
       if (newRecord.isRight()) { 
        item.add(new AttributeModifier("style", "background-color:green;")); 
       } else { 
        item.add(new AttributeModifier("style", "background-color:red;")); 
       } 

      } else { 
        item.add(new AttributeModifier("style", "")); 
      } 
     target.add(item); //refreshing 
     } 

Очевидно, что вы можете сделать это более надежным с помощью моделей и/или перезапись метод NEWVALUE из AttributeModifier.

+0

Я не рекомендую многократно добавлять одно и то же поведение. В этом случае он добавляет поведение каждый раз, когда вы нажимаете или запускаете событие изменения AJAX. Это означает, что вы создаете слишком много экземпляров, которые просто заменяют один и тот же ключ в таблице атрибутов тегов до тех пор, пока не будет достигнут последний. В этом случае использование модели является лучшим решением. –

Смежные вопросы