blackberrybuttonfield

Blackberry custom ButtonField with icon and text


How would I go about creating a custom ButtonField that includes an icon? I have found several different sources for a ButtonField with a custom background Bitmap, but I want to have a button with an Icon and text under it. I can not find anyt informaiton about this, maybe someone here could help me out?

Cheers


Solution

  • Try this

    package com.MYAPP.controls;
    
    
    import com.MYAPP.bll.Log;
    
    import net.rim.device.api.system.Bitmap;
    import net.rim.device.api.system.Characters;
    import net.rim.device.api.ui.Color;
    import net.rim.device.api.ui.Field;
    import net.rim.device.api.ui.Font;
    import net.rim.device.api.ui.Graphics;  
    
    public class ButtonControl extends Field {
       private Bitmap selectedBitmap;
       private Bitmap unSelectedBitmap;
       private String _label; 
       protected boolean focus = false; 
       protected int bWidth = 0;
       protected int bHeight = 0;
       int padding = 0; 
       Font font=Font.getDefault();
       public ButtonControl(String icon, String label) {
           super(Field.FOCUSABLE); 
           _label = label; 
           try {
    
    
                     selectedBitmap = Bitmap.getBitmapResource(icon + "_focus.png");
                     unSelectedBitmap =Bitmap.getBitmapResource(icon + ".png");
                     padding = 0;
    
           } catch (Exception ex) {
                   Log.Error(ex, "Cannot load icon {" + icon + "}");
           }
    
           bWidth = selectedBitmap.getWidth();
           bHeight = selectedBitmap.getHeight();
       }
    
       protected void onFocus(int direction) {
           focus = true;
           invalidate();
       }
    
       protected void onUnfocus() {
           focus = false;
           invalidate();
       }
    
       public void drawFocus(Graphics g, boolean on) {
               // do nothing... this is handled in paint...
       }
    
       protected int moveFocus(int amount, int status, int time) {
           // This ensures background is redrawn properly if this control is
           // the first or last in a series (eliminate white background issue)
           invalidate();
           return super.moveFocus(amount, status, time);
       }
    
       protected void moveFocus(int x, int y, int status, int time) {
           // This ensures background is redrawn properly if this control is
           // the first or last in a series (eliminate white background issue)
           invalidate();
           super.moveFocus(x, y, status, time);
       }
    
       int _labelWidth;
       int posbitmapX=0;
       int x=0;
       int y = 0;
       protected void paint(Graphics g) { 
           int oldColor = g.getColor();
           Font oldFont = g.getFont();
           g.setFont(getTextFont());  
           x = (getWidth() - bWidth) / 2;  
           if (focus) {
                   g.setColor(Color.WHITE);
                   g.drawBitmap(x, y, bWidth, bHeight, selectedBitmap, 0, 0);
           } else {
                   g.setColor(Color.BLACK);
                   g.drawBitmap(x, y, bWidth, bHeight, unSelectedBitmap, 0, 0);
           } 
    
           g.setFont(getTextFont());
           _labelWidth = getTextFont().getAdvance(_label);
           g.drawText(_label, 0, bHeight + 2, Graphics.HCENTER, getWidth());
           g.setColor(oldColor);
           g.setFont(oldFont);
       }
    
    
       protected void layout(int width, int height) {
               setExtent(getPreferredWidth(), getPreferredHeight());
       } 
    
       private Font getTextFont() { 
           return font;
       }
    
       public int getPreferredWidth() { 
           return selectedBitmap.getWidth();
       }
    
       public int getPreferredHeight() {
               return (bHeight + 2 + font.getHeight() + 2);
       }
    
       protected boolean keyChar(char key, int status, int time) {
           if (key == Characters.ENTER) { 
               return this.navigationClick(status, time);
           }
    
           return super.keyChar(key, status, time);
      } 
       protected boolean navigationClick(int status, int time) { 
           fieldChangeNotify(1); 
               return true;
      }
       protected void fieldChangeNotify(int context) {
           try {
                   this.getChangeListener().fieldChanged(this, context);
           } catch (Exception e) {
                   Log.Debug("Error responding to field change: " + e);
           }
       } }