Smartgwt listgrid动态/动态高亮显示
我有一个smartGwt列表网格,用于显示股票市场数据。我希望能够突出显示单元格的值。例如-如果其当前值大于上一个值,则变为绿色,如果较低,则变为红色。我查看了smartGWT的showcase以了解任何此类功能,但我只找到了用于突出显示的示例代码Smartgwt listgrid动态/动态高亮显示,smartgwt,listgrid,Smartgwt,Listgrid,我有一个smartGwt列表网格,用于显示股票市场数据。我希望能够突出显示单元格的值。例如-如果其当前值大于上一个值,则变为绿色,如果较低,则变为红色。我查看了smartGWT的showcase以了解任何此类功能,但我只找到了用于突出显示的示例代码 new Hilite() {{ setFieldNames("area", "gdp"); setTextColor("#FFFFFF"); setB
new Hilite() {{
setFieldNames("area", "gdp");
setTextColor("#FFFFFF");
setBackgroundColor("#639966");
setCriteria(new AdvancedCriteria(OperatorId.AND, new Criterion[] {
new Criterion("gdp", OperatorId.GREATER_THAN, 1000000),
new Criterion("area", OperatorId.LESS_THAN, 500000)}));
setCssText("color:#3333FF;background-color:#CDEB8B;");
setHtmlAfter(" " + Canvas.imgHTML("[SKIN]/actions/back.png"));
setId("1");
}}
如果“gdp”或“面积”字段的值大于或小于一个固定数字,“gdp”或“面积”字段将突出显示。是否可以使用类似的高亮显示,但应将该值与单元格中的上一个值进行比较
谢谢和问候
Mukul以前的值不会存储在模型中的任何位置。因此,这种比较是不可能一蹴而就的 一个可能的解决方案是创建重复的隐藏列表网格字段,如areaPrevious或GDPPPrevious。当数据更改时,您将填充gdp/area和GDPP上一个/area上一个字段。使用cellFormatters代替hilites
gdpField.setCellFormatter(new CellFormatter(){
public String format(Object value, ListGridRecord record, int rowNum, int colNum){
if( record.getAttribute("gdpPrevious") < record.getAttribute("gdp")){
return "<div style=\"width:14px;height:14px;background-color:green;\">+value+ "</div>";
}else{
return "<div style=\"width:14px;height:14px;background-color:red;\">"+value+ "</div>";
}
}
});
gdpField.setCellFormatter(新的CellFormatter(){
公共字符串格式(对象值、ListGridRecord记录、int rowNum、int colNum){
if(record.getAttribute(“gdpPrevious”)
除了Abhijith的方法外,他们还在SmartGWT Enterprise showcase中找到了一种替代方法,粘贴在此处供将来参考。他们通过覆盖getCellCSSText方法实现了这一点-
stockQuotesGrid = new ListGrid() {
private int blinkPeriod = 2000;
// Cell animation - go bright green or red on a change, then fades.
protected String getCellCSSText(ListGridRecord record, final int rowNum,
final int colNum) {
// changeValue column
Date lastUpdated = record.getAttributeAsDate("lastUpdated");
if (colNum == 2 && lastUpdated != null) {
long delta = System.currentTimeMillis() - lastUpdated.getTime();
if (delta < blinkPeriod) {
// refresh 10x / second
new Timer() {
public void run() {
stockQuotesGrid.refreshCell(rowNum, colNum);
}
}.schedule(100);
float changeValue = record.getAttributeAsFloat("changeValue");
float ratio = ((float) (blinkPeriod - delta)) / blinkPeriod;
int color = 255 - Math.round(200 * ratio);
if (changeValue > 0) {
return "background-color:#" + Integer.toHexString(color) + "FF"
+ Integer.toHexString(color);
} else if (changeValue < 0) {
return "background-color:#FF" + Integer.toHexString(color)
+ Integer.toHexString(color);
}
} else {
record.setAttribute("lastUpdated", (Date) null);
}
}
// no style override
return null;
};
};
stockQuotesGrid=new ListGrid(){
私人投资期=2000年;
//细胞动画-变为亮绿色或红色,然后淡出。
受保护字符串getCellCSSText(ListGridRecord记录,最终整数rowNum,
final int colNum){
//更改值列
Date lastUpdated=记录。GetAttributesDate(“lastUpdated”);
如果(colNum==2&&lastUpdated!=null){
long delta=System.currentTimeMillis()-lastUpdated.getTime();
如果(增量<周期){
//刷新10次/秒
新计时器(){
public void run(){
refreshCell(rowNum,colNum);
}
}.附表(100);
float changeValue=record.getAttributesFloat(“changeValue”);
浮动比率=((浮动)(闪烁周期-增量))/闪烁周期;
int color=255-数学四舍五入(200*比率);
如果(changeValue>0){
返回“背景色:#”+整数.toHexString(颜色)+“FF”
+整数。tohextstring(颜色);
}如果(changeValue<0){
返回“背景色:#FF”+整数.toHexString(颜色)
+整数。tohextstring(颜色);
}
}否则{
record.setAttribute(“lastUpdated”,(Date)null);
}
}
//无样式替代
返回null;
};
};
@Abhijith:谢谢你的回答,我还找到了另一种解决方案。机制是相同的(创建一个重复的先前值字段或维护一个更改值字段并将其保留在模型中)。但是,我没有使用CellFormatter,而是重写了getCellCSSText方法来完成此操作。我已添加了该方法的代码,以供将来参考。再次感谢