Blackberry change color of child fields on horizon

2019-06-08 18:47发布

I have an array of horizontal manager which consist of editfield, dropdown, label and a button. I place all these array of horizontalfield manager in one vertical manager to make a table like grid like structure. I can make it but I want to do that if we get focus on horizontal manager then all components in the horizontal manager should give a same color I don't know how to make this.

1条回答
霸刀☆藐视天下
2楼-- · 2019-06-08 19:02

If you in 4.5 and lower, extend HorizontalFieldManager, add color property, use it on paint event and invalidate on focus change:

class Scr extends MainScreen {
 HorizontalFieldManager mMainPanel;
 VerticalFieldManager mVerticalPanel;

 public Scr() {
  mMainPanel = new HorizontalFieldManager();
  add(mMainPanel);

  mVerticalPanel = new VerticalFieldManager(USE_ALL_HEIGHT
    | USE_ALL_WIDTH);
  mMainPanel.add(mVerticalPanel);
  for (int i = 0; i < 5; i++) {
   HFMHighlight hfm = new HFMHighlight();
   hfm.setHightlightColor(Color.GRAY);
   hfm.add(new LabelField("Label " + i, FIELD_LEFT));
   hfm.add(new BasicEditField(FIELD_RIGHT));
   mVerticalPanel.add(hfm);
  }
 }
}

class HFMHighlight extends HorizontalFieldManager {

 int mHColor = -1;

 public void setHightlightColor(int color) {
  mHColor = color;
 }

 protected void onFocus(int direction) {
  invalidate();
  super.onFocus(direction);
 }

 protected void onUnfocus() {
  invalidate();
  super.onUnfocus();
 }

 public void paint(Graphics graphics) {
  if (-1 != mHColor && isFocus()) {
   graphics.setBackgroundColor(mHColor);
   graphics.clear();
  }
  super.paint(graphics);
 }
}

If you in 4.6 and higher, use setBackground for VISUAL STATE FOCUS:

class Scr extends MainScreen {
    HorizontalFieldManager mMainPanel;
    VerticalFieldManager mVerticalPanel;

    public Scr() {
        RadioInfo.isDataServiceOperational();
        CoverageInfo.isOutOfCoverage();
        WLANInfo.getWLANState();

        mMainPanel = new HorizontalFieldManager();
        add(mMainPanel);
        mVerticalPanel = new VerticalFieldManager(USE_ALL_HEIGHT
                | USE_ALL_WIDTH);
        mMainPanel.add(mVerticalPanel);
        for (int i = 0; i < 5; i++) {
            HFMHighlight hfm = new HFMHighlight(Color.GRAY);
            hfm.add(new LabelField("Label " + i, FIELD_LEFT));
            hfm.add(new BasicEditField(FIELD_RIGHT));
            mVerticalPanel.add(hfm);
        }
    }
}

class HFMHighlight extends HorizontalFieldManager {

    public HFMHighlight(int color) {
        Background focusedBG = BackgroundFactory.createSolidBackground(color);
        setBackground(VISUAL_STATE_FOCUS, focusedBG);
    }

    protected void onFocus(int direction) {
        invalidate();
        super.onFocus(direction);
    }

    protected void onUnfocus() {
        invalidate();
        super.onUnfocus();
    }
}

And here is a case if you want to highlight all controls (button, checkbox, choice and edit) if horizontal manager is focused:

class Scr extends MainScreen {
    HorizontalFieldManager mMainPanel;
    VerticalFieldManager mVerticalPanel;

    public Scr() {
        mMainPanel = new HorizontalFieldManager();
        add(mMainPanel);
        mVerticalPanel = new VerticalFieldManager(USE_ALL_HEIGHT
                | USE_ALL_WIDTH);
        mMainPanel.add(mVerticalPanel);
        for (int i = 0; i < 5; i++) {
            HHorizontalFieldManager hfm = new HHorizontalFieldManager();
            mVerticalPanel.add(hfm);
            HButtonField button = new HButtonField("btn");
            button.setHightlightColor(Color.GRAY);
            hfm.add(button);
            HCheckboxField checkbox = new HCheckboxField("chk box", false);
            checkbox.setHightlightColor(Color.GRAY);
            hfm.add(checkbox);
            String choiceItems[] = { "one", "two", "three" };
            HObjectChoiceField dropdown = new HObjectChoiceField("choice",
                    choiceItems);
            dropdown.setHightlightColor(Color.GRAY);
            hfm.add(dropdown);          
            HEditField edit = new HEditField("edit", "___");
            edit.setHightlightColor(Color.GRAY);
            hfm.add(edit);
        }
    }
}

class HHorizontalFieldManager extends HorizontalFieldManager {
    public HHorizontalFieldManager() {
        super();
    }

    public HHorizontalFieldManager(long style) {
        super(style);
    }

    protected void onFocus(int direction) {
        invalidate();
        super.onFocus(direction);
    }

    protected void onUnfocus() {
        invalidate();
        super.onUnfocus();
    }

    public void paint(Graphics graphics) {
        if (isFocus()) {
            graphics.setBackgroundColor(Color.GRAY);
            graphics.clear();
        }
        super.paint(graphics);
    }
}

class HEditField extends EditField {

    public HEditField() {
        super();
    }

    public HEditField(long style) {
        super(style);
    }

    public HEditField(String label, String initialValue, int maxNumChars,
            long style) {
        super(label, initialValue, maxNumChars, style);
    }

    public HEditField(String label, String initialValue) {
        super(label, initialValue);
    }

    private int mHColor = -1;

    public void setHightlightColor(int color) {
        mHColor = color;
    }

    protected void onFocus(int direction) {
        invalidate();
        super.onFocus(direction);
    }

    protected void onUnfocus() {
        invalidate();
        super.onUnfocus();
    }

    public void paint(Graphics graphics) {
        if (-1 != mHColor && getManager().isFocus()) {
            graphics.setBackgroundColor(mHColor);
            graphics.clear();
        }
        super.paint(graphics);
    }
}

class HButtonField extends ButtonField {

    public HButtonField() {
        super();
    }

    public HButtonField(long style) {
        super(style);
    }

    public HButtonField(String label, long style) {
        super(label, style);
    }

    public HButtonField(String label) {
        super(label);
    }

    private int mHColor = -1;

    public void setHightlightColor(int color) {
        mHColor = color;
    }

    protected void onFocus(int direction) {
        invalidate();
        super.onFocus(direction);
    }

    protected void onUnfocus() {
        invalidate();
        super.onUnfocus();
    }

    public void paint(Graphics graphics) {
        if (-1 != mHColor && getManager().isFocus()) {
            graphics.setBackgroundColor(mHColor);
            graphics.clear();
        }
        super.paint(graphics);
    }
}

class HCheckboxField extends CheckboxField {

    public HCheckboxField() {
        super();
    }

    public HCheckboxField(String label, boolean checked, long style) {
        super(label, checked, style);
    }

    public HCheckboxField(String label, boolean checked) {
        super(label, checked);
    }

    private int mHColor = -1;

    public void setHightlightColor(int color) {
        mHColor = color;
    }

    protected void onFocus(int direction) {
        invalidate();
        super.onFocus(direction);
    }

    protected void onUnfocus() {
        invalidate();
        super.onUnfocus();
    }

    public void paint(Graphics graphics) {
        if (-1 != mHColor && getManager().isFocus()) {
            graphics.setBackgroundColor(mHColor);
            graphics.clear();
        }
        super.paint(graphics);
    }
}

class HObjectChoiceField extends ObjectChoiceField {
    public HObjectChoiceField() {
        super();
    }

    public HObjectChoiceField(String label, Object[] choices, 
        int initialIndex, long style) {
        super(label, choices, initialIndex, style);
    }

    public HObjectChoiceField(String label, Object[] choices, 
            int initialIndex) {
        super(label, choices, initialIndex);
    }

    public HObjectChoiceField(String label, Object[] choices,
            Object initialObject) {
        super(label, choices, initialObject);
    }

    public HObjectChoiceField(String label, Object[] choices) {
        super(label, choices);
    }

    private int mHColor = -1;

    public void setHightlightColor(int color) {
        mHColor = color;
    }

    protected void onFocus(int direction) {
        invalidate();
        super.onFocus(direction);
    }

    protected void onUnfocus() {
        invalidate();
        super.onUnfocus();
    }

    public void paint(Graphics graphics) {
        if (-1 != mHColor && getManager().isFocus()) {
            graphics.setBackgroundColor(mHColor);
            graphics.clear();
        }
        super.paint(graphics);
    }
}
查看更多
登录 后发表回答