2009-08-12 2 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() 메서드가 두 번 호출된다는 것입니다. - 처음에는 이전에 선택된 행 (아직 선택 상태 임)에 대한 호출과 두 번째로 새 선택된 행 (이미 선택된 상태에 있음) ...

이전에 선택한 행 인덱스를 저장하고 drawRow()의 각 호출에서 다시 그려야했지만 어떤 이유로 LabelField.paint() 메소드가 트리거되지 않았습니다.

그래서 간단하고 어쨌든 못생긴 해결책이 있습니다. ListField.invalidate() TimerTask를 예약하십시오. 100ms의 기간만으로도 충분하며 성능에도 영향을 미치지 않습니다.

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); 
     } 
    } 
} 
관련 문제