2009-09-04 3 views
0

次の問題の解決策が見つかりません。私はレイアウトマネージャの境界に重なるカスタムリストフィールドを持っています。リストフィールドは、マネージャからのナビゲーションイベントを消費して、現在選択されている行を特別な色で強調表示します。レイアウトマネージャは、スクロールをサポートするように構成されています。トラックホイールをスクロールダウンすると、レイアウトマネージャはスクロールを呼び出し、ナビゲーションイベントをその子、リストフィールドに渡します。マネージャーはリスト全体を、選択された行を含む最上部の隠れリスト行にスクロールするので、スクロールが不適切になります。レイアウトマネージャのスクロールをキャンセルします

私が望むのは、現在選択されているリスト行がまだ表示されている間はスクロールを無視し、それ以外の場合は使用します。

私は、我々はListFieldを実装があるとしましょうJDE 4.2.1

答えて

0

すべてここに私を助けたソリューションです。このような特定の方法でmoveFocusをオーバーライドすることで、レイアウトマネージャのスクロールのデフォルト動作を変更することができました。リストフィールドの最初の項目をスキップして、それらを上に置くことができます。

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

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

を使用しています:

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(); 
} 
} 

私たちは、上下のフィールドの中にこのよう、このリストを整列する場合: ListField with scroll http://img6.imageshack.us/img6/7025/8800j.png
を我々カスタムマネージャを使用して高さを制限することができます:

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()); 
} 
} 

今すぐ使用できます:

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(); 
} 
} 
eJDE 4.2.1.17でテスト
+0

ご協力いただきありがとうございます。本当にありがとうございます。実際は、moveFocusメソッドを特別な方法でオーバーライドすることで、スクロールの問題を解決しました。しばらくのうちに解決策を投稿します。 – nixau

+0

よろしくお願いします!あなたの答えを得ることは素晴らしいことです! –

関連する問題