2009-08-12 15 views
2

我有一個重寫的LabelField,允許我根據ListField中的項目是應該制服還是現在改變字體顏色。使LabelField顏色柔和很好。但是,當行(包含我的LabelField)在ListField中突出顯示時,我希望標籤字段顏色不同或倒置。父級管理員擁有焦點時,如何在ListField內爲LabelField文本着色?

這裏是我的代碼:

public class MyLabelField extends LabelField{

public MyLabelField (String s, long l){ 
    super(s, l); 
    m_bSubdue = true; // this value does change in implementation but not in this sample 
} 

protected void paint(Graphics g) 
{ 
    if(m_bSubdue && !this.isFocus()){ // this isFocus() trick is not working 
     int color = 0x00696969; // RGB val 
     g.setColor(color); 
    } 
    super.paint(g); 
} 

boolean m_bSubdue; 

}

在此示例中,我想MyLabelField與灰色的顏色繪製,但是當ListField排它包含在具有焦點,我喜歡的顏色默認爲LabelField繪畫,它應該是白色的。

基於測試我的代碼,似乎LabelField在其父行具有焦點時不會獲得焦點。也許需要改變其他地方在我的代碼...

回答

0

要切換的的LabelField顏色,如果它的選擇,我們可以檢查它的paint()方法。但即使如此,我們將不得不重新繪製ListField中的每一行。而這就是問題所在:ListField的每次行選擇改變時,只有兩個ListFieldCallback.drawRow()方法調用 - 首先爲先前選定行(仍處於選中狀態)和第二新選擇行(處於選擇狀態的話) ...

我試圖保存以前選擇的行索引和重繪它drawRow()的每次調用,但由於某種原因LabelField.paint()方法不是那麼觸發。

所以我帶着簡單的,不知何故醜陋的解決方案:計劃ListField.invalidate()的TimerTask。 100毫秒的時間就足夠了,也不會影響性能。

Jason Emerick's code I've been used as a guide to extended ListField.

class LabelListField extends ListField implements ListFieldCallback { 
    private Vector mValues; 
    private Vector mRows; 

    public LabelListField(Vector values) { 
     super(0); 
     setRowHeight(70); 
     setCallback(this); 

     mValues = values; 
     fillListWithValues(values); 

     scheduleInvalidate(); 
    } 

    private void scheduleInvalidate() { 
     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(new TimerTask() { 
      public void run() { 
       invalidate(); 
      } 
     }, 0, 100); 
    } 

    private void fillListWithValues(Vector values) { 
     mRows = new Vector(); 
     for (int i = 0; i < values.size(); i++) { 
      TableRowManager row = new TableRowManager(); 
      String title = "Item# " + String.valueOf(i + 1); 
      LabelField titleLabel = new LabelField(title); 
      titleLabel.setFont(Font.getDefault().derive(Font.BOLD)); 
      row.add(titleLabel); 
      String value = (String) values.elementAt(i); 
      ListLabel valueLabel = new ListLabel(this, i, value); 
      valueLabel.setFont(Font.getDefault().derive(Font.ITALIC)); 
      row.add(valueLabel); 
      mRows.addElement(row); 
     } 
     setSize(mRows.size()); 
    } 

    private class TableRowManager extends Manager { 
     public TableRowManager() { 
      super(0); 
     } 

     public void drawRow(Graphics g, int x, int y, 
      int width, int height) { 
      layout(width, height); 
      setPosition(x, y); 
      g.pushRegion(getExtent()); 
      paintChild(g, getField(0)); 
      paintChild(g, getField(1)); 
      g.popContext(); 
     } 

     protected void sublayout(int width, int height) { 
      int fontHeight = Font.getDefault().getHeight(); 
      int preferredWidth = getPreferredWidth(); 
      Field field = getField(0); 
      layoutChild(field, preferredWidth - 5, fontHeight + 1); 
      setPositionChild(field, 5, 3); 
      field = getField(1); 
      layoutChild(field, preferredWidth - 5, fontHeight + 1); 
      setPositionChild(field, 5, fontHeight + 6); 
      setExtent(preferredWidth, getPreferredHeight()); 
     } 

     public int getPreferredWidth() { 
      return Display.getWidth(); 
     } 

     public int getPreferredHeight() { 
      return getRowHeight(); 
     } 
    } 

    public void drawListRow(ListField listField, Graphics g, 
      int index, int y, int width) { 
     LabelListField list = (LabelListField) listField; 
     TableRowManager rowManager = (TableRowManager) list.mRows 
       .elementAt(index); 
     rowManager.drawRow(g, 0, y, width, list.getRowHeight()); 

    } 

    public Object get(ListField list, int index) { 
     return mValues.elementAt(index); 
    } 

    public int indexOfList(ListField list, String prefix, int start) { 
     for (int x = start; x < mValues.size(); ++x) { 
      String value = (String) mValues.elementAt(x); 
      if (value.startsWith(prefix)) { 
       return x; 
      } 
     } 
     return -1; 
    } 

    public int getPreferredWidth(ListField list) { 
     return Display.getWidth(); 
    } 

    class ListLabel extends LabelField { 
     int mIndex = -1; 

     public ListLabel(LabelListField list, int index, String text) { 
      super(text); 
      mIndex = index; 
     } 

     protected void paint(Graphics graphics) { 
      if (getSelectedIndex() == mIndex) 
       graphics.setColor(Color.RED); 
      else 
       graphics.setColor(Color.BLUE); 
      super.paint(graphics); 
     } 
    } 
} 
相關問題