2012-03-01 64 views
1

我有一个smartGwt ListGrid,我用它来显示股市数据。我希望能够突出显示单元格的价值。例如 - 如果其当前值大于最后一个值,则变为绿色,如果变低,则变为红色。我查看了smartGWT的任何此类功能的展示柜,但我只找到了突出显示的示例代码。Smartgwt listgrid在飞/动态突出显示

 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”或“area”字段的值大于或小于固定值,则字段将突出显示。是否可以使用类似的突出显示,但是应该将该值与单元格中的前一个值进行比较?

感谢和问候 穆库尔

回答

2

前值不会对模型任何存储。所以这个比较不能在现实中完成。

一个可能的解决方案是建立像areaPrevious或gdpPrevious隐藏式两份名单电网领域。当数据更改时,填充gdp/area和gdpPrevious/areaPrevious字段。而不是使用hilites你使用cellFormatters。

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>"; 
     } 
    } 
}); 
+0

@ Abhijith:谢谢你的回答,我还找到了另一种解决方案。机制是相同的(创建一个重复的先前值字段或维护更改值字段并将其保留在模型中)。但是,我没有使用CellFormatter,而是覆盖getCellCSSText方法来完成此操作。我已经添加了代码作为未来参考的答案。 再次感谢 – 2012-03-02 06:28:35

1

除了Abhijith的方法,在SmartGWT企业展示中找到了替代方法 - 在此处粘贴以供将来参考。他们通过覆盖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; 
      }; 
     };