2009-08-12 3 views
2

私は、私のListField内の項目を抑制するかどうかに基づいてフォントの色を変更できるように、上書きされたLabelFieldを持っています。 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()メソッドが2回だけ呼び出されます - 最初に選択された行(まだ選択状態)と2番目の新しい選択行...

以前選択した行インデックスを保存して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); 
     } 
    } 
} 
関連する問題