2010-03-16 4 views
2

Cher tous, J'ai un problème lors de la création d'une interface utilisateur sur Blackberry. D'abord, j'essaie de créer une classe ChatLayoutManager étendue à partir de la classe Manager. Ma mise en page a trois composants: topfield, champ principal et champ inférieur.Comment contrôler la classe de gestionnaire dans Blackberry

public class ChatLayoutManager extends Manager { 
    private Field bottomField; 
    private Field mainField; 
    private Field titleField; 

    public ChatLayoutManager(long style) { 
     super(style); 
    } 

    protected void sublayout(int width, int height) { 
     setExtent(width, height); 

     int y = 0; 
     if (bottomField != null) { 
      layoutChild(bottomField, width, height); 
      // This goes at the bottom of the screen 
      setPositionChild(bottomField, 0, height-bottomField.getHeight()); 
      height -= bottomField.getHeight(); 
     } 

     if (titleField != null) { 
      layoutChild(titleField, width, height); 
      // This goes at the top of the screen 
      setPositionChild(titleField, 0, 0); 
      height -= titleField.getHeight(); 
      y += titleField.getHeight(); 
     } 

     if (mainField != null) { 

      layoutChild(mainField, width, height); 
      // This goes just below the title field (if any) 
      setPositionChild(mainField, 0, y); 
     } 

    } 

    public void setMainField(Field f) { 
     mainField = f; 
     add(f); 
    } 

    public void setBottomField(Field f) { 
     bottomField = f; 
     add(f); 
    } 

    public void setTitleField(Field f) { 
     titleField = f; 
     add(f); 
    } 

Puis je créer un autre champ (Chatfield) prolongée du directeur à ajouter à Mainfield dans la classe ChatLayoutManager que j'ai créé ci-dessus.

public class ChatField extends Manager{ 

private Field _contentField[]; 

protected ChatField(){ 
    super(Manager.HORIZONTAL_SCROLL | Manager.VERTICAL_SCROLL); 
} 
// TODO Auto-generated constructor stub} 

protected synchronized void sublayout(int width, int height) { 
    // TODO Auto-generated method stub 
    setExtent(width, height); 
    int x = 0; 
    int y = 0; 

    if(_contentField.length > 0){ 
     for(int i = 0 ;i<_contentField.length; i++){ 
      //if(getManager() == this){ 
       this.layoutChild(_contentField[i], 
          _contentField[i].getWidth(), 
          _contentField[i].getHeight()); 
       this.setPositionChild(_contentField[i], x, y); 
       if(_contentField[i++]!= null){ 
        if ((_contentField[i].getWidth() + _contentField[i].getWidth()) 
          >= width){ 
         x = 0; 
         y += _contentField[i].getHeight(); 
        } 
        else{ 
         x += _contentField[i].getWidth(); 

        } 
       } 
      //} 
     } 

    } 

} 

public void setContentField(Field field[]){ 
    _contentField = field; 
} 

}

Et maintenant, quand je crée des champs (tels que TextField, BitmapField ...) ajouté à Chatfield, le programme a une erreur « champ n'est pas un enfant de ce gestionnaire ». La raison en est lorsque le cadre invoque la sublayout fonction du Chatfield classe, quand sublayout commence à appeler layoutChild fonction le gestionnaire de champ n'est pas Chatfield mais ChatlayoutManager.

J'ai du mal à essayer de résoudre ce problème, mais je n'ai toujours pas de solution. Quelqu'un peut-il me donner des suggestions? J'apprécie beaucoup.

Répondre

4

Lorsque vous appelez Manager.add() (en transmettant un champ), ce champ devient un enfant de ce gestionnaire. Un champ ne peut être qu'un enfant d'un seul gestionnaire - il ne peut appartenir à plusieurs gestionnaires. Si vous obtenez cette erreur, vous l'ajoutez peut-être accidentellement à plusieurs gestionnaires.

4

Votre fonction setContentField (Field []) obtient une référence au tableau de champs fourni, mais elle n'ajoute jamais le contenu du tableau au gestionnaire (ChatField). C'est pourquoi vous obtenez l'erreur que le champ n'est pas un enfant de ce gestionnaire.

En second lieu, en ce qui concerne votre Chatfield # sublayout, vous devez faire une des opérations suivantes:

1) Au lieu de référencer le tableau _contentField directement, la fonctionnalité d'utilisation fournie par le gestionnaire pour faire référence à ses enfants:

int numFields = getFieldCount(); // getFieldCount() is a member of Manager 
int marginHorizontal = 0; 
for(int i = 0; i < numFields; i++) { 
    field = getField(i); // getField() is a member of Manager 
    // Whatever you need to do to it. 
} 

2) Si vous souhaitez toujours faire référence plutôt _contentField directement, ou si vous avez besoin d'un contrôle sur un champ spécifique, assurez-vous que le gestionnaire du champ est le gestionnaire étant aménagé:

for(int i = 0 ;i<_contentField.length; i++){ 
    if(_contentField[i] != null && _contentField[i].getManager() == this){ 
     // Whatever you need to do to it. 
    } 
} 

Espérons que cela aide.

+0

d'accord, il y a aussi un bogue dans 'if (_contentFields [i ++]! = Null) {' code, préférable d'utiliser 'if (i-1 <_contentFields.lenght) {' –

Questions connexes