問題は、ImageListField自体ではなく、ImageListFieldを含むクラスgetFieldWithFocusIndex()
のメソッドであるを呼び出していることです。
を含むManager
、または、がある場合は、そのオブジェクトにフォーカスのあるフィールドを要求しています。それはおそらく常にあなたのオブジェクトのインデックスを返すでしょう。それはあなたが望まないリスト全体です。そのリスト内の行のインデックスが必要です。したがって、別の方法が必要です。Screen
ImageListField
list
FocusChangeListener listFocus = new FocusChangeListener() {
public void focusChanged(Field field, int eventType) {
//int index = getFieldWithFocusIndex();
int index = list.getSelectedIndex();
System.out.println("Index: " + index + " event: " + eventType);
}
};
list.setFocusListener(listFocus);
オブジェクトの呼び出しgetSelectedIndex()
は機能するはずです。list
メソッドが3回表示される理由については、おそらく複数の種類のフォーカスイベントがあるためです。FocusChangeListenerのAPIドキュメントから:
static int FOCUS_CHANGED
イベントを促すフィールドは、フォーカスの変更を通知します。
staticintFOCUS_GAINEDイベントを促す
フィールドがフォーカスを取得しました。
staticintFOCUS_LOSTイベントを促す
フィールドがフォーカスを失いました。
この通知を1回だけ受け取りたい場合は、イベントタイプのチェックを追加できます(これがフラグと呼ばれているものかどうかはわかりませんが、これを行う最も簡単な方法です)。
public void focusChanged(Field field, int eventType) {
if (eventType == FocusChangeListener.FOCUS_CHANGED) {
int index = list.getSelectedIndex();
System.out.println("Index: " + index + " event: " + eventType);
}
}
また、これはこの質問に対して投稿したコードに含まれている可能性がありますが、もちろん、フォーカスされたインデックスをメンバー変数に格納する必要があります。index
ローカル変数にのみ保存すると、後で[削除]メニュー項目を選択したときにオブジェクトで使用できなくなります。