2012-03-01 65 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; 
      }; 
     };