Blackberry VerticalFieldManager avec taille fixe : problème de Défilement

Je suis d'essayer d'avoir un plein écran de l'INTERFACE utilisateur avec un correctif de l'en-tête ( gestionnaire avec quelques champs) et un défilement de contenu (une liste de champ personnalisé). L'idée est d'imiter une sorte de liste déroulante.

Pour ce que j'ai fait une coutume VerticalFieldManager qui acceptent une maxHeight (la hauteur de l'écran - l'en-tête de la hauteur).

J'ai eu les problèmes suivants:

  • Les flèches de défilement n'apparaissent pas (jamais)
  • Sur OS 4.7 (la Tempête), je peux faire défiler plus bas que le dernier élément, jusqu'à ce que n'ayant rien sur mon écran, mais l'en-tête.

Mon code pour compiler avec la JDE 4.2.1 & 4.7 et à l'exécution de la Perle et de la Tempête. (au pire je pourrais avoir deux version de cette classe)

Je soupçonne que les deux problèmes sont liés. J'ai probablement fait quelque chose de mal. J'ai regardé quelques exemple/forum et toujours trouvé de solution similaire/code.
Les gars, vous ne pouvez me dire ce que j'ai fait de mal?

/**
 *  custom class, so we can set a max height (to keep the header visible)
 */
class myVerticalFieldManager extends VerticalFieldManager{
private int maxHeight = 0;

myVerticalFieldManager(int _maxHeight){
  super(
   //this provoc an "empty scrollable zone" on Storm
   //but if you don't put it, on other OS, the vertical manager does not scroll at all.
   Manager.VERTICAL_SCROLL 

   | Manager.VERTICAL_SCROLLBAR
   ); 
  maxHeight = _maxHeight;
}


protected void sublayout(int width, int height){
        super.sublayout(width, getPreferredHeight());
        setExtent(width, getPreferredHeight());
}

public int getPreferredWidth() {
    return Graphics.getScreenWidth();
}

/**
 * allow the manager to use all the given height. (vs auto Height)
 */
public boolean forceMaxHeight = false;
public int getPreferredHeight() {
  if (forceMaxHeight) return maxHeight;
  int m = super.getPreferredHeight();
  if (m > maxHeight) m = maxHeight;
  return m;   
}    

////////////////////////////////////////////////////////////////////////////

protected boolean isUpArrowShown(){
  //TODO: does not seem to work (4.2.1 emulator & 4.5 device). (called with good return value but the arrows are not painted)
  int i = getFieldWithFocusIndex();
  //Trace("isUpArrowShown " + i);
  return i > 0;
  //note: algo not correct, cause the up arrow will be visible event when no field are hidden.
  //      but not so bad, so the user "know" that he can go up.
}

protected boolean isDownArrowShown(){
  int i = getFieldWithFocusIndex();
  return i < getFieldCount();
}

////////////////////////////////////////////////////////////////////////////
//note : since 4.6 you can use
//http://www.blackberry.com/developers/docs/4.6.0api/net/rim/device/api/ui/decor/Background.html

public int myBackgroundColor = 0xffffff;
protected void paint(Graphics g){
    g.setBackgroundColor(myBackgroundColor);
    //Clears the entire graphic area to the current background
    g.clear();
    super.paint(g);
}


} 

toute aide est la bienvenue.

OriginalL'auteur Loda | 2009-11-02