Search code examples
blackberryblackberry-editfield

Custom editfield not displaying all typed text


Below class is a textbox field. Can this be modified so that when the textbox is filled with text and user keeps type the text then scrolls ? Whats happening now is that once the textbox is filled with text any subsequent text that is typed is not being displayed.

Thanks

import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.component.EditField;

public class CustomEditField extends EditField {
    // private members of the CustomEditField class
    private Font defaultFont;
    // used to get the default font
    private String text;

    // used to specify the default width of the table cells

    // constructor calls the super class constructor
    public CustomEditField(String label, String initialValue, int maxNumChars,
            long style) {
        super(label, initialValue, maxNumChars, style);
    }

    // overrides the default getPreferredWidth functionality to return a fixed
    // width
    public int getPreferredWidth() {
        defaultFont = Font.getDefault();
        text = "0000000000";
        return defaultFont.getAdvance(text);

    }

    // overrides the default layout functionality to set the width of the table
    // cell
    protected void layout(int width, int height) {
        width = getPreferredWidth();
        height = super.getPreferredHeight();
        super.layout(width, height);
        // uses the super class' layout functionality
        // after the width and the height are set
        super.setExtent(width, height);
        // uses the super class' setExtent functionality
        // after the width and the height are set
    }

    public void paint(Graphics graphics){

        graphics.setBackgroundColor(Color.LIGHTBLUE);
        super.paint(graphics);
    }

}

Solution

  • This will help you to get started. It is a simplified version of the ScrollableEditField that I am using. I coded it before touch BlackBerry devices became available, therefore some additional work is required here to support TouchEvents.

    class ScrollableEditField extends Manager {
        private final static int        DEFAULT_TOP_PADDING     = 1;
        private final static int        DEFAULT_BOTTOM_PADDING  = 1;
        private final static int        DEFAULT_LEFT_PADDING    = 1;
        private final static int        DEFAULT_RIGHT_PADDING   = 1; 
    
        private int                     TOTAL_VERTICAL_PADDING  = DEFAULT_TOP_PADDING + DEFAULT_BOTTOM_PADDING;
        private int                     TOTAL_HORIZONTAL_PADDDING = DEFAULT_LEFT_PADDING + DEFAULT_RIGHT_PADDING;
    
        private int                     width  = -1;
        private int                     height = -1;
    
        private HorizontalFieldManager  hfm = new HorizontalFieldManager(HORIZONTAL_SCROLL);
        private EditField               ef;
    
        public ScrollableEditField(String label, String initialValue, int maxNumChars, long innerEditFieldStyle) {
            super(NO_HORIZONTAL_SCROLL);
            ef = new EditField(label, initialValue, maxNumChars, innerEditFieldStyle);
            hfm.add(ef);
            add(hfm);
        }
    
        protected void sublayout(int width, int height) {
            if (this.width != -1) {
                width = this.width;
            }
    
            if (this.height != -1) {
                height = this.height;
            } else {
                height = ef.getFont().getHeight();
            }
    
            layoutChild(hfm, width-TOTAL_HORIZONTAL_PADDDING, height-TOTAL_VERTICAL_PADDING);
            setPositionChild(hfm, DEFAULT_LEFT_PADDING, DEFAULT_TOP_PADDING);
            setExtent(width, height);
        }    
    
        public EditField getEditField() {
            return ef;
        }
    
        public void setWidth(int width) {
            this.width = width;
        }
    
        protected void onFocus(int direction) {
            super.onFocus(direction);
            ef.setCursorPosition(0);
        }
    
        protected void onUnfocus() {
            hfm.setHorizontalScroll(0);
            super.onUnfocus();
        }
    };
    
    public class ScrollableEditFieldScreen extends MainScreen {
        public ScrollableEditFieldScreen() {
            super(NO_VERTICAL_SCROLL);
            setTitle("ScrollableEditField");
    
            // hfm1 and hfm2 are here just to position the ScrollableEditField in the center of the screen
            HorizontalFieldManager hfm1 = new HorizontalFieldManager(USE_ALL_HEIGHT | FIELD_HCENTER);
            HorizontalFieldManager hfm2 = new HorizontalFieldManager(FIELD_VCENTER);
    
            // instantiating the scrollable edit field and adding border
            ScrollableEditField sef = new ScrollableEditField("", "", 50, 0);
            sef.setBorder(BorderFactory.createRoundedBorder(new XYEdges(5,5,5,5)));
            sef.setWidth(sef.getFont().getAdvance('0')*10);
    
            hfm2.add(sef);
            hfm1.add(hfm2);
            add(hfm1);
        }
    }