2010-11-08 3 views
1

J'ai écrit un champ d'édition personnalisé avec bordure à l'aide JDE4.2.1 Ce champ est ensuite ajouté à un VerticalLayoutManager et instancié en tant que tel:problème alignement champ d'édition personnalisé pour BlackBerry


BorderEditField bef = new BorderEditField("Enter a value: ", null, 6, 
       BorderEditField.FIELD_RIGHT | BorderEditField.FILTER_NUMERIC); 

Cependant, quel que soit le style que je spécifie (FIELD_HCENTER), le champ est toujours aligné à gauche. Y at-il quelque chose d'évident que je pourrais manquer ici? Essayé sur les différentes versions de JDE avec le même résultat ...


public class BorderEditField extends BasicEditField { 
    public BorderEditField(String label, String initialValue, int maxNumChars, long style) 
    { 
     super(label, initialValue, maxNumChars, style); 
    } 

    private int iRectX = getFont().getAdvance(getLabel()); 
    private int iRectWidth = (getMaxSize() * getFont().getAdvance("X")) + 16; 

    public int getPreferredWidth() { 
     return Display.getWidth(); 
    } 

    public void layout(int width, int height) { 
     super.layout(width, getPreferredHeight()); 
     setExtent(width, getPreferredHeight()); 
    } 

    public void paint(Graphics g) { 
     super.paint(g); 
     if (isFocus()) { 
      g.setColor(Color.RED); 
      g.setGlobalAlpha(220); 
      g.drawRect(iRectX, 0, iRectWidth, getPreferredHeight()); 
     } else { 
      g.setColor(Color.BLACK); 
      g.setBackgroundColor(Color.DARKBLUE); 
      g.setGlobalAlpha(150); 
      g.drawRect(iRectX, 0, iRectWidth, getPreferredHeight()); 
     } 
    } 
} 

Merci.

Répondre

2

Lorsque vous créez le VerticalFieldManager, l'indiquez-vous à USE_ALL_WIDTH? Si vous ne définissez pas ce drapeau, il sera seulement aussi large que le composant le plus large, donc peu importe le style que vous avez défini pour ses enfants, ils seront toujours identiques.

== == Mise à jour

Ok, une autre chose à regarder sont votre mise en page et les méthodes getPreferredWidth. Dans getPreferredWidth, vous le définissez sur la largeur de l'écran. Cela signifie qu'il occupera toute la largeur du gestionnaire et qu'il ne pourra donc pas le positionner. Essayez de calculer la largeur réelle en fonction du contenu. Même avec la méthode layout, vous appelez setExtent avec la largeur totale disponible. Cela indique au gestionnaire que le composant doit occuper toute la largeur. Essayez d'utiliser la largeur préférée, une fois que vous l'avez calculé correctement.

Pour un test rapide, avant de commencer à essayer de calculer la largeur, vous pouvez simplement y insérer une valeur. Si cela fait une différence, vous pouvez commencer à calculer correctement la largeur.

+0

essayées avec USE_ALL_WIDTH sans succès. Les champs personnalisés sont contenus dans un VerticalLayoutManager et d'autres champs d'édition semblent être correctement alignés. Cela me donne l'impression qu'il me manque quelque chose dans le domaine personnalisé lui-même. – emt14

1

Bonne réponse de Dave le code ressemble maintenant à ceci et le champ s'aligné correctement:

BorderEditField public (label String, String initialValue, int maxNumChars, style long) { super (étiquette, initialValue, maxNumChars, style); }

private int iRectX = getFont().getAdvance(getLabel()); 

public int getPreferredWidth() { 
    return super.getMaxSize() * super.getFont().getAdvance("X"); 
} 

public int getPreferredHeight() { 
    return super.getPreferredHeight(); 
} 

public void layout(int width, int height) { 
    width = Math.min(width, getPreferredWidth()); 
    height = Math.min(height, getPreferredHeight()); 
    super.layout(width, height); 
    setExtent(width, height); 

} 

public void paint(Graphics g) { 
    super.paint(g); 
    if (isFocus()) { 
     g.setColor(Color.RED); 
     g.drawRect(iRectX, 0, getPreferredWidth() , getPreferredHeight()); 
    } else { 
     g.setColor(Color.BLACK); 
     g.drawRect(iRectX, 0, getPreferredWidth() , getPreferredHeight()); 
    } 
} 

Questions connexes