2009-09-04 6 views
0

Je ne trouve pas de solution au problème suivant. J'ai un champ de liste personnalisé, qui chevauche les limites de son gestionnaire de disposition. Le champ Liste consomme les événements de navigation du gestionnaire pour mettre en surbrillance la ligne actuellement sélectionnée avec une couleur spéciale. Le gestionnaire de mise en page est configuré pour supporter le défilement. Lorsque je fais défiler la molette vers le bas, le gestionnaire de disposition appelle le défilement, puis transmet l'événement de navigation à son enfant, le champ de liste. Il en résulte un défilement inopérant, car le gestionnaire fait défiler toute la liste jusqu'à ses lignes inférieures de la liste de masquage, en haut, y compris la ligne sélectionnée. Ce que je veux, c'est ignorer le défilement alors que la ligne de liste actuellement sélectionnée est encore visible et l'utiliser autrement.Annuler le défilement dans le Gestionnaire de configuration

J'utilise JDE 4.2.1

Répondre

0

tout est ici la solution qui m'a aidé. En remplaçant moveFocus de manière spécifique, j'ai réussi à modifier le comportement par défaut de défilement dans le gestionnaire de disposition - il saute les premiers éléments du champ de liste leur permettant de rester au top.

public int moveFocus(int amount, int status, int time) { 
    invalidate(getSelectedIndex()); 

    int unused = super.moveFocus(amount, status, time); 
    return Math.abs(unused) + 1; 
} 
1

Disons que nous avons mise en œuvre ListField:

class LabelListField extends ListField implements ListFieldCallback { 
private Vector mValues; 

public LabelListField(Vector values) { 
    super(0); 
    setRowHeight(getFont().getHeight() + 10); 
    setCallback(this); 
    mValues = values; 
    setSize(mValues.size()); 
} 

public void drawListRow(ListField listField, Graphics g, int index, int y, 
    int width) { 
    g.drawText((String) mValues.elementAt(index), 0, y); 
} 

public Object get(ListField list, int index) { 
    return mValues.elementAt(index); 
} 

public int indexOfList(ListField list, String prefix, int start) { 
    for (int x = start; x < mValues.size(); ++x) { 
    String value = (String) mValues.elementAt(x); 
    if (value.startsWith(prefix)) { 
    return x; 
    } 
    } 
    return -1; 
} 

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

Si nous voulons aligner cette liste dans les champs supérieurs et inférieurs ainsi: ListField with scroll http://img6.imageshack.us/img6/7025/8800j.png
nous peut limiter la hauteur à l'aide est gestionnaire personnalisé:

class ListManager extends HorizontalFieldManager { 
ListField mListField; 

public ListManager(ListField listField) { 
    super(VERTICAL_SCROLL | VERTICAL_SCROLLBAR); 
    mListField = listField; 
    add(mListField); 
} 

public int getPreferredHeight() { 
    int result = Display.getHeight(); 
    Manager manager = getManager(); 
    if (null != manager) { 
    for (int i = 0, count = manager.getFieldCount(); i < count; i++) { 
    if (manager.getField(i) != this) 
    result -= manager.getField(i).getPreferredHeight(); 
    } 
    } 

    // size down to fit max rows without splitting 
    result = result - result % mListField.getRowHeight(); 
    return result; 
} 

protected void sublayout(int maxWidth, int maxHeight) { 
    super.sublayout(maxWidth, maxHeight); 
    setExtent(maxWidth, getPreferredHeight()); 
} 
} 

maintenant, nous pouvons l'utiliser:

class Scr extends FullScreen implements FieldChangeListener { 
LabelField mHeader; 
ListManager mHFMList; 
HorizontalFieldManager mHFMButton; 
LabelListField mListField; 
ButtonField mButton; 

public Scr() { 
    super(DEFAULT_MENU | DEFAULT_CLOSE); 

    mHeader = new LabelField("List Field", FIELD_HCENTER); 
    add(mHeader); 

    Vector values = new Vector(); 
    values.addElement("first"); 
    values.addElement("second"); 
    values.addElement("third"); 
    values.addElement("fourth"); 
    values.addElement("fifth"); 
    values.addElement("sixth"); 
    values.addElement("seventh"); 
    values.addElement("eight"); 
    mListField = new LabelListField(values); 

    mHFMList = new ListManager(mListField); 
    add(mHFMList); 

    mHFMButton = new HorizontalFieldManager(FIELD_HCENTER); 
    add(mHFMButton); 

    mButton = new ButtonField("Exit", ButtonField.CONSUME_CLICK); 
    mButton.setChangeListener(this); 
    mHFMButton.add(mButton); 
} 

public void fieldChanged(Field field, int context) { 
    if (mButton == field) 
    close(); 
} 
} 

Testé sur Ejde 4.2.1.17 8800

+0

Merci beaucoup pour votre aide, je l'apprécie vraiment. En fait, j'ai déjà résolu mes problèmes de défilement en remplaçant la méthode moveFocus d'une manière spéciale. Je posterai la solution dans un moment. – nixau

+0

Vous êtes les bienvenus! Ce serait génial d'avoir votre réponse! –

Questions connexes