Java 如何更改Wicket中AjaxEditableLabelColumn单元格的颜色

Java 如何更改Wicket中AjaxEditableLabelColumn单元格的颜色,java,wicket,Java,Wicket,我有一个带有onChange方法的AjaxEditableLabelColumn。我需要更改刚刚编辑的单元格的背景色。 代码如下: private AjaxEditableLabelColumn CreateMeditableColumn(字符串属性表达式,布尔可排序){ AjaxEditableLabelColumn=新的AjaxEditableLabelColumn(propertyExpression,可排序){ 私有静态最终长serialVersionUID=1L; @凌驾 受保护的vo

我有一个带有
onChange
方法的
AjaxEditableLabelColumn
。我需要更改刚刚编辑的单元格的背景色。 代码如下:

private AjaxEditableLabelColumn CreateMeditableColumn(字符串属性表达式,布尔可排序){
AjaxEditableLabelColumn=新的AjaxEditableLabelColumn(propertyExpression,可排序){
私有静态最终长serialVersionUID=1L;
@凌驾
受保护的void onChange(AjaxRequestTarget目标,IModel模型){
用户newRecord=model.getObject();
if(newRecord.hasChanged()){
if(newRecord.isRight()){
((转绿)))
}否则{
(((()()))
}
}否则{
((去除颜色)))
}
}
};
返回列;
}

最简单的解决方案是在单元格中添加一个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
        }
@覆盖
受保护的void onChange(AjaxRequestTarget目标,IModel模型){
用户newRecord=model.getObject();
if(newRecord.hasChanged()){
if(newRecord.isRight()){
添加(新的属性修改器(“样式”,“背景色:绿色;”);
}否则{
添加(新的属性修改器(“样式”,“背景色:红色;”);
}
}否则{
添加(新的AttributeModifier(“样式”,“样式”);
}
target.add(item);//刷新
}

显然,通过使用模型和/或覆盖AttributeModifier的newValue方法,您可以使这一点更加可靠。

我建议您只添加一个属性修饰符行为,并更改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;
    }
.bkg-default { background-color: transparent; }
.bkg-green { background-color: green; }
.bkg-red { background-color: red; }

我看不出这是一个Wicket类:它是什么?我猜@Mot4创建了自己的类,对吗?我不建议多次添加相同的行为。在这种情况下,它会在每次单击或触发AJAX更改事件时添加该行为。这意味着您创建了太多的实例,在到达最后一个实例之前,这些实例只是替换标记属性映射中的同一个键。对于这种情况,使用模型是更好的解决方案。