0

Я пытаюсь создать пару объектов BasicEditField после того, как я получу номер полей, которые я хочу от ObjectChoiceField.Как создать число полей динамически в Blackberry Java SDK 5.0?

Проблема: поля BasicEditField, которые я добавляю на свой экран, не обновляются, если я не делаю это в слушателе от моего ObjectChoiceField.

то, что я хочу сделать:

  1. выбрать количество BasicEditFields, что я хочу.
  2. обновите экран, чтобы появилось поле.

PD: если вам нужна дополнительная информация, просто скажите мне, и извините за мой английский. Я новичок в разработке для plataform BlackBerry

public final class MyScreen extends MainScreen 
{ 
    private int fields_lenght; 

    public MyScreen() 
    {   
     // Set the displayed title of the screen  
     setTitle("Example"); 
     fields_lenght =0; 

     final String shortcodes[] = {"1","2","3"}; 
     final ObjectChoiceField dropdownlist=new ObjectChoiceField("Select a number of fields",shortcodes); 
     this.add(dropdownlist); 

     dropdownlist.setChangeListener(new FieldChangeListener() { 

      public void fieldChanged(Field arg0, int arg1) { 
        if(arg1 != PROGRAMMATIC){ 
         fields_lenght= Integer.parseInt(shortcodes[dropdownlist.getSelectedIndex()]); 
        } 
      } 
     }); 

     // how to refresh the screen with the new fields ??? 

      BasicEditField fields[]=new BasicEditField [fields_lenght] ; 

      for(int i = 0; i<fields.length;i++){ 
       fields[i]=new BasicEditField("Campo "+i,""); 
       this.add(fields[i]); 
      } 

    } 

} 
+0

Можете ли вы показать нам код, в котором вы добавляете новые элементы BasicEditFields? (просто нажмите ссылку ** изменить ** под вопросом и добавьте код в свой вопрос). Также есть причина, по которой вы ** не хотите делать это в слушателе ObjectChoiceField? – Nate

+0

@Nate Hello Nate хорошо теперь вы можете увидеть пример того, что я хочу сделать. – AmirG

+0

@Nate Я не хотел использовать его в слушателе ObjectChoiceField, потому что он добавляет больше полей, чем мне нужно, так как слушатель принимает щелчок и движение трек-колесо как одно и то же действие, я пытался переопределить щелчок и движение колесика, но он не работал. Также я хотел бы удалить поля, например, если выбор изменится на 2 из 3, что означает, что мне нужно будет удалить одно поле. Надеюсь, я объяснил сам. я читаю о методе Invalidate() с экрана, но я действительно не понимаю, как его реализовать. – AmirG

ответ

2

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

попробовать что-то вроде этого:

public final class MyScreen extends MainScreen { 

    /** A cached vector of the BasicEditFields, to make deleting easier */ 
    private Vector fields; 

    public MyScreen() { 
     super(MainScreen.VERTICAL_SCROLL | MainScreen.VERTICAL_SCROLLBAR); 

     setTitle("Example"); 

     final String shortcodes[] = {"1","2","3"}; 
     final ObjectChoiceField dropdownlist = new ObjectChoiceField("Select a number of fields", shortcodes); 
     add(dropdownlist); 

     fields = new Vector(); 
     final Screen screen = this; 

     dropdownlist.setChangeListener(new FieldChangeListener() { 

     public void fieldChanged(Field field, int context) { 
      if (context != PROGRAMMATIC) { 
       // how many fields has the user chosen? 
       int fieldsLength = Integer.parseInt(shortcodes[dropdownlist.getSelectedIndex()]); 

       while (fieldsLength > fields.size()) { 
        // we need to ADD more fields 
        Field f = new BasicEditField("Campo " + fields.size(), ""); 
        fields.addElement(f); 
        screen.add(f); 
       } 

       while (fieldsLength < fields.size()) { 
        // we need to DELETE some fields 
        Field f = (Field)fields.elementAt(fields.size() - 1); 
        fields.removeElement(f); 
        screen.delete(f); 
       }           
      } 
     } 
     }); 
    } 

Я определил новый элемент с именем fields, который просто делает его легче следить за основные поля редактирования (в случае, если этот экран имеет много других полей, тоже).

Когда вызывается прослушиватель поля выбора, я определяю, сколько полей требуется пользователю; если им нужно больше, я добавляю их на экран и в вектор fields. Если они хотят меньше, я удаляю некоторые поля из конца Vector и удаляю их с экрана.

Примечание: здесь не нужно звонить invalidate(). Вызов Screen#add() или Screen#delete() должен добавлять/удалять поля и вызывать перерисовку.

+0

wow спасибо Nate, я не знаю, что я делал, что внутри слушателя он понимает движение колесика, как колесо прокрутки, так что даже когда он просто просматривает список, он что-то выбрал. В любом случае код, который вы мне дали, отлично работал, спасибо, что у брата хороший день! – AmirG

Смежные вопросы