как динамически создать несколько VerticalFieldManager Blackberry

Я изо всех сил пытался создать несколько VerticalFieldManager динамически на Blackberry. Каждый субменеджер будет показывать пользователю разные данные. И у каждого субменеджера будет своя позиция на экране. Итак, я создал класс, который имеет «mainManager» и другой класс, который создает «подменеджеры», затем я вызываю mainManager.add(new TheClassExtendingVerticalFieldManager);, чтобы добавить подменеджеры в mainManager. Проблема в том, что я получаю только один subManager вместо трех. Я использую дополнение для разделения менеджеров. Вот код, который я использую. Пожалуйста, направьте меня в правильном направлении, это было бы очень признательно.

Класс, создающий субменеджер

public class ProgramListView extends VerticalFieldManager{

    private VerticalFieldManager subManager;
    private int _height;


    public ProgramListView(int height){
        this._height = height;

//      subManager = new VerticalFieldManager(
//              Manager.NO_HORIZONTAL_SCROLL | Manager.NO_VERTICAL_SCROLL | Manager.NO_VERTICAL_SCROLLBAR | 
//              Manager.NO_HORIZONTAL_SCROLLBAR | Manager.USE_ALL_WIDTH)
//
//      {
//
//
//      };
    }

    public int get_height() {
        return _height;
    }

    public void set_height(int _height) {
        this._height = _height;
    }

    public void setCoordinates(int x, int y){
        setPosition(100,140);
    }
    protected void sublayout(int maxWidth, int maxHeight)
    {
        int displayWidth = Display.getWidth();
        int displayHeight = maxHeight;
        this.setPosition(300, 300);
        super.sublayout( 40, 40);
        setPadding(this.get_height(), 0, 0, 0);
        setExtent(displayWidth, this.get_height());

    }

    public void paint(Graphics graphics)
    {
        graphics.setBackgroundColor(Color.BLUE);//blue
        graphics.clear();
        super.paint(graphics);      
    }
    public int getPreferredWidth() {
        // TODO Auto-generated method stub
        return Display.getWidth();
    }

} 

Класс mainManager

public class ProgramLayout extends MainScreen {

    private HorizontalFieldManager mainManager;
    private int deviceWidth = Display.getWidth();
    private int deviceHeight = Display.getHeight();
    private Vector subManagers;
    private int theheight;

    public ProgramLayout(){

        setToolbar();
        subManagers = new Vector();
        theheight = 100;
        mainManager = new HorizontalFieldManager(Manager.VERTICAL_SCROLL | Manager.USE_ALL_WIDTH | Manager.USE_ALL_HEIGHT)

        {

            protected void sublayout(int maxWidth, int maxHeight)
            {
                int displayWidth = deviceWidth;
                int displayHeight = deviceHeight;
                super.sublayout( displayWidth, displayHeight);
                setExtent(displayWidth, displayHeight);
            }

            public void paint(Graphics graphics)
            {
                graphics.setBackgroundColor(Color.BLACK);
                graphics.clear();
                super.paint(graphics);
            }

            public int getPreferredWidth() {
                // TODO Auto-generated method stub
                return Display.getWidth();
            }

        };
        for (int i = 0; i < 3; i++) {
            theheight = theheight+100;
            subManagers.addElement(new ProgramListView(theheight));
        }

        for (int i = 0; i < subManagers.size(); i++) {

            mainManager.add((VerticalFieldManager)subManagers.elementAt(i));
        }


        this.add(mainManager);

    }

заранее спасибо


person madcoderz    schedule 13.07.2012    source источник
comment
Возможно, потому что вы используете HorizontalFieldManager, а класс подменеджера запрограммирован на всю ширину экрана.   -  person Eugen Martynov    schedule 13.07.2012
comment
Просто чтобы уточнить то, что указал Евгений, ваш mainManager является HorizontalFieldManager, что означает, что он будет размещать дочерние поля в том порядке, в котором вы их add(), по горизонтали. Но каждый дочерний элемент является экземпляром ProgramListView и возвращает Display.getWidth() в getPreferredWidth(). Итак, первый занимает всю ширину экрана. Вы хотите, чтобы эти три ProgramListView располагались вертикально? Тогда mainManager должно быть VerticalFieldManager.   -  person Nate    schedule 14.07.2012
comment
Спасибо, парни. Смена основного менеджера на вертикальный помогла.   -  person madcoderz    schedule 14.07.2012
comment
Привет, @Nate, если ты поместишь свой комментарий как фактический ответ, я могу выбрать его как правильный ответ. Спасибо   -  person madcoderz    schedule 17.07.2012
comment
Комментарий опубликован как ответ по запросу :)   -  person Nate    schedule 22.07.2012


Ответы (2)


попробуй это:

    for (int i = 0; i < 3; i++) {
        theheight = theheight+100;
         mainManager.add(new ProgramListView(theheight));
    }
    this.add(mainManager);
person payal    schedule 17.07.2012

Просто чтобы уточнить, на что указал Евгений Мартынов, ваш mainManager - это HorizontalFieldManager, что означает, что он будет размещать дочерние поля в том порядке, в котором вы добавляете() их, по горизонтали. Он автоматически обрабатывает макет для вас, основываясь на порядке звонков, которые вы делаете для add().

Но каждый дочерний элемент является экземпляром ProgramListView и возвращает Display.getWidth() в getPreferredWidth():

public int getPreferredWidth() {         
    // TODO Auto-generated method stub         
    return Display.getWidth();     
}

Итак, первый занимает всю ширину экрана, а следующие два должны быть справа от него (но вы уже заняли всю ширину экрана).

Вы хотели, чтобы эти три ProgramListViews стояли вертикально? Затем mainManager нужно просто заменить на VerticalFieldManager. С VerticalFieldManager вызов add() для трех разных ProgramListView дочерних полей автоматически разместит их по вертикали.

person Nate    schedule 17.07.2012