如何忽略gridfieldmanager中单元格的焦点?

时间:2013-12-20 20:13:34

标签: blackberry blackberry-eclipse-plugin

为了我的问题,我刚刚做了这个例子。

public MyScreen()
{       
    setTitle("GridFieldManager");
    GridFieldManager grid2 = new GridFieldManager(1,2,GridFieldManager.FIXED_SIZE);

    add(grid2);

    String[] choice={"1","2","0"};
    ObjectChoiceField menu=new ObjectChoiceField(null,choice);

    //grid.add(lol);
    grid2.add(new LabelField("Productos_",NON_FOCUSABLE));
    grid2.add(menu);
}

出于某种原因,即使我说它不可聚焦(Field.NON_FOCUSABLE),我仍然可以专注于labelfield。

注意:只是为了让您知道,我正在使用标签+ objectchoicefield,因此我可以完全控制该标签的属性,因为我发现从objectchoicefield的标签更改颜色和字体很麻烦。

在此图片中,您可以看到重点是LabelField。我只想关注objectchoicefield列表。

enter image description here

1 个答案:

答案 0 :(得分:2)

老实说,对我而言,这似乎是一个错误。我不认为它应该这样工作。但是,此时,旧的BlackBerry Java设备中没有任何内容可以修复,因此我们只需要解决它。

问题是您已将LabelField设置为不可聚焦,但设备忽略了这一点。它正在打开你的屏幕,专注于GridFieldManager,它只关注它的第一个字段(标签)。如果用户将焦点移到选择字段上,您将无法将焦点返回到标签字段。但是,我确信你不希望屏幕开放时把焦点放在不可聚焦的东西上。

您可以手动将焦点设置到选择字段:

  //grid.add(lol);
  grid2.add(new LabelField("Productos_", NON_FOCUSABLE));
  grid2.add(menu);  

  menu.setFocus();

或者,如果你想更普遍地处理这个问题,你可以编写自己的方法来将焦点初始化为第一个可以实现焦点的字段:

public class LabelFocusScreen extends MainScreen {

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

      setTitle("GridFieldManager");
      GridFieldManager grid2 = new GridFieldManager(1,2,GridFieldManager.FIXED_SIZE);

      add(grid2);


      String[] choice={"1","2","0"};
      ObjectChoiceField menu=new ObjectChoiceField(null,choice);

      //grid.add(lol);
      grid2.add(new LabelField("Productos_", NON_FOCUSABLE));
      grid2.add(menu);  

      initializeFocus(this);
   }

   /** @return true if focus was set within the given field */
   private boolean initializeFocus(Field f) {
      boolean focusSet = false;
      if (f instanceof Manager) {
         Manager m = (Manager)f;
         // loop over all child fields, recursively
         for (int i = 0; i < m.getFieldCount(); i++) {
            if (initializeFocus(m.getField(i))) {
               focusSet = true;
               break;
            }
         }
      } else if (f.isFocusable()) {
         f.setFocus();
         focusSet = true;
      }
      return focusSet;
   }
}

这两种解决方案都适合你。

注意:顺便说一句,您不必将LabelField实际设置为不可聚焦。默认情况下它不可聚焦。它没有伤害。它只是不需要。


更新

如果您还希望以后能够将焦点设置回grid2(在屏幕首次出现之后),您还可以再次调用我的initializeFocus()方法,以防止出现任何问题 - 可聚焦标签获得关注。

例如,创建屏幕implement FocusChangeListener,然后在其构造函数中:

  grid2.add(new LabelField("Productos_", NON_FOCUSABLE));
  grid2.add(menu); 
  grid2.setFocusListener(this);

焦点侦听器实现包含此新方法(在屏幕类中):

public void focusChanged(Field f, int event) {
   if (event == FocusChangeListener.FOCUS_GAINED) {
      initializeFocus(f);
   }
}

这将允许为initializeFocus()管理器对象调用grid2,如果稍后将焦点设置回它。调用initializeFocus(),将网格字段管理器作为参数传递,将正确地将焦点设置为其第一个可聚焦字段。