1

I want to add two labelfields in a HorizontalFieldManager, I want to show two labels as one left aligned and another right aligned like this

enter image description here

hfm1 = new HorizontalFieldManager(Manager.USE_ALL_WIDTH);
        hfm1.setMargin(10,0,10,0);
        l1 = new LabelField("Weight:");
        l2 = new LabelField("20");
        l1.setMargin(0,10,0,0);
        l2.setMargin(0,5,0,0);
        hfm1.add(l1);
        hfm1.add(l2);
j2me
  • 189
  • 11
Newts
  • 1,354
  • 14
  • 23

3 Answers3

6

Try this code

LabelField labl1=new LabelField("weight");
LabelField labl2=new LabelField("20");
JustifiedHorizontalFieldManager JustifiedHorizontalFieldManager=new JustifiedHorizontalFieldManager(labl1,labl2,true);
add(JustifiedHorizontalFieldManager);

JustifiedHorizontalFieldManager class is given below-

import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.Manager;

public class JustifiedHorizontalFieldManager extends Manager
{
    private static final int SYSTEM_STYLE_SHIFT = 32;

    public Field _leftField;
    public Field _rightField;

    private boolean _giveLeftFieldPriority;

    public JustifiedHorizontalFieldManager( Field leftField, Field rightField, boolean giveLeftFieldPriority )
    {
        this( leftField, rightField, giveLeftFieldPriority, Field.USE_ALL_WIDTH );
    }

    public JustifiedHorizontalFieldManager( Field leftField, Field rightField, boolean giveLeftFieldPriority, long style )
    {
        super( style );

        _leftField = leftField;
        _rightField = rightField;

        add( _leftField );
        add( _rightField );

        _giveLeftFieldPriority = giveLeftFieldPriority;
    }

    public JustifiedHorizontalFieldManager( boolean giveLeftFieldPriority, long style )
    {
        super( style );
        _giveLeftFieldPriority = giveLeftFieldPriority;
    }

    public void addLeftField( Field field )
    {
        if( _leftField != null ) {
            throw new IllegalStateException();
        }
        _leftField = field;
        add( _leftField );
    }

    public void addRightField( Field field )
    {
        if( _rightField != null ) {
            throw new IllegalStateException();
        }
        _rightField = field;
        add( _rightField );
    }

    public int getPreferredWidth()
    {
        return _leftField.getPreferredWidth() + _rightField.getPreferredWidth();
    }

    public int getPreferredHeight()
    {
        return Math.max( _leftField.getPreferredHeight(), _rightField.getPreferredHeight() );
    }

    protected void sublayout( int width, int height )
    {
        Field firstField;
        Field secondField;
        if( _giveLeftFieldPriority ) {
            firstField = _leftField;
            secondField = _rightField;
        } else {
            firstField = _rightField;
            secondField = _leftField;
        }

        int maxHeight = 0;

        int availableWidth = width;
        availableWidth -= _leftField.getMarginLeft();
        availableWidth -= Math.max( _leftField.getMarginRight(), _rightField.getMarginLeft() );
        availableWidth -= _rightField.getMarginRight();

        layoutChild( firstField, availableWidth, height - firstField.getMarginTop() - firstField.getMarginBottom() );
        maxHeight = Math.max( maxHeight, firstField.getMarginTop() + firstField.getHeight() + firstField.getMarginBottom() );
        availableWidth -= firstField.getWidth();

        layoutChild( secondField, availableWidth, height - secondField.getMarginTop() - secondField.getMarginBottom() );
        maxHeight = Math.max( maxHeight, secondField.getMarginTop() + secondField.getHeight() + secondField.getMarginBottom() );
        availableWidth -= secondField.getWidth();

        if( !isStyle( Field.USE_ALL_HEIGHT ) ) {
            height = maxHeight;
        }
        if( !isStyle( Field.USE_ALL_WIDTH ) ) {
            width -= availableWidth;
        }

        setPositionChild( _leftField, _leftField.getMarginLeft(), getFieldY( _leftField, height ) );
        setPositionChild( _rightField, width - _rightField.getWidth() - _rightField.getMarginRight(), getFieldY( _rightField, height ) );

        setExtent( width, height );
    }

    private int getFieldY( Field field, int height )
    {
        switch( (int)( ( field.getStyle() & FIELD_VALIGN_MASK ) >> SYSTEM_STYLE_SHIFT ) ) {
            case (int)( FIELD_BOTTOM >> SYSTEM_STYLE_SHIFT ):
                return height - field.getHeight() - field.getMarginBottom();
            case (int)( FIELD_VCENTER >> SYSTEM_STYLE_SHIFT ):
                return field.getMarginTop() + ( height - field.getMarginTop() - field.getHeight() - field.getMarginBottom() ) / 2;
            default:
                return field.getMarginTop();
        }
    }


    public Field getLeftField()
    {
        return _leftField;
    }

    public Field getRightField()
    {
        return _rightField;
    }

    public void replace( Field oldField, Field newField )
    {
        if( oldField == newField ) {
            // Nothing to do
            return;
        }

        if( oldField == _leftField ) {
            _leftField = newField;
        } else if( oldField == _rightField ) {
            _rightField = newField;
        }
        add( newField );
        delete( oldField );
    }

}
Nate
  • 31,017
  • 13
  • 83
  • 207
Rince Thomas
  • 4,158
  • 5
  • 25
  • 44
  • Its working fine but when I am using one as Label and other one is BasicEditField it shows in left align....:( – Newts Apr 17 '12 at 09:14
  • 1
    add the BasicEditField in an vertical or horizontal field manager and JustifiedHorizontalFieldManager JustifiedHorizontalFieldManager=new JustifiedHorizontalFieldManager(labl,hfm/vfm,true); @Newts – Rince Thomas Apr 17 '12 at 09:17
  • join on http://chat.stackoverflow.com/rooms/4014/knowledge-sharing-center-for-blackberry-android-and-java @Newts – Rince Thomas Apr 17 '12 at 09:44
5

IMHO the most elegant solution would be

HorizontalFieldManager hfm = new HorizontalFieldManager(Manager.USE_ALL_WIDTH);
hfm.setMargin(10,0,10,0);

LabelField l1 = new LabelField("Weight:");
l1.setMargin(0,10,0,0);
hfm.add(l1);

VerticalFieldManager vfm = new VerticalFieldManager(Manager.USE_ALL_WIDTH);
LabelField l2 = new LabelField("20", Field.FIELD_RIGHT);
l2.setMargin(0,5,0,0);
vfm.add(l2);
hfm.add(vfm);

add(hfm);

and the result

enter image description here

tonymontana
  • 5,728
  • 4
  • 34
  • 53
0

Another way of doing this you can make a custom labelfield with two label and add it where you want. Like as

public class LableFieldWithTwoLable extends LabelField {

private final String lbl2;
private final String lbl1;

public LableFieldWithTwoLable(String lbl1,String lbl2) {
    super();
    this.lbl1 = lbl1;
    this.lbl2 = lbl2;
}


public int getPreferredWidth() {
        return super.getPreferredWidth();

}
protected void layout(int width, int height) {
    super.layout(width, height);
    setExtent(getPreferredWidth(), getPreferredHeight());
}

protected void paint(Graphics graphics) {
int ypos = getContentHeight()/2;
graphics.drawText(lbl1, 0, ypos ,DrawStyle.LEFT | DrawStyle.VCENTER);
graphics.drawText(lbl2, 0, ypos ,DrawStyle.RIGHT | DrawStyle.VCENTER);
super.paint(graphics);
}

}

Now you have to just add this label field in your manager like as

HorizontalFieldManager hfm = new HorizontalFieldManager();
hfm.add(new LableFieldWithTwoLable("name","13") );

If you want any other functionality then add constructor in LableFieldWithTwoLable() class according to your need.

Nsr
  • 219
  • 1
  • 11