【问题标题】:How to create a number of Fields dynamically in Blackberry Java SDK 5.0?如何在 Blackberry Java SDK 5.0 中动态创建多个字段?
【发布时间】:2013-11-11 22:31:16
【问题描述】:

在我从 ObjectChoiceField 获得 number 个我想要的字段后,我正在尝试创建几个 BasicEditField 对象。

问题:我添加到屏幕的BasicEditField 字段不会刷新,除非我在ObjectChoiceField 的侦听器中执行此操作。

我想做什么:

  1. 选择我想要的BasicEditFields的号码。
  2. 刷新屏幕以显示添加的字段。

PD:如果您需要更多信息,请告诉我,对不起我的英语。我是 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]);
            }

     }

}

【问题讨论】:

  • 你能告诉我们你在哪里添加新的 BasicEditFields 的代码吗? (只需单击问题下方的 edit 链接并将代码添加到您的问题中)另外,您是否有原因不想想要在 ObjectChoiceField 侦听器中执行此操作?
  • @Nate 你好 Nate 现在你可以看到我想做的一个例子了。
  • @Nate 我不想在 ObjectChoiceField 侦听器中使用它,因为它添加的字段比我需要的多,因为侦听器将拨轮单击和移动视为相同的操作,我试图覆盖拨轮单击和移动但它没有用。我也想删除字段,例如,如果选择从 3 更改为 2,这意味着我必须删除一个字段。我希望我自己解释。我从屏幕上读到了 Invalidate() 方法,但我真的不明白如何实现它。

标签: blackberry blackberry-eclipse-plugin blackberry-jde blackberry-basiceditfield


【解决方案1】:

您真的应该在您的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。如果他们想要更少,我会从 Vector 末尾删除一些字段,然后将它们从屏幕中删除。

注意:这里不需要调用invalidate()。调用Screen#add()Screen#delete() 应该会添加/删除字段并导致重新绘制。

【讨论】:

  • 哇,谢谢 Nate,我不知道我在听听者在做什么,他将拨轮运动理解为拨轮点击,所以即使他只是通过列表导航,它也选择了一些东西。无论如何,你给我的代码运行良好,谢谢兄弟,祝你有美好的一天!
猜你喜欢
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
相关资源
最近更新 更多