0

私はImageListField(カスタムリスト)を持っています。メニューには、リスト内の要素を削除したい削除オプションがあります。そのため、次のコードを設定しました。フォーカスのある要素の行インデックスを取得したい...その要素IDを渡して削除し、さらに処理します。

public FocusChangeListener listFocus = new FocusChangeListener(){ 
        public void focusChanged(Field field, int eventType) {
            int index = getFieldWithFocusIndex(); 

            Dialog.alert("Index: "+index);
            // But its not giving the specific row index.
        }
    };
list.setFocusListener(listFocus);

また、3回上映されています。フラグを使用する以外に、1に制限する方法は?

4

1 に答える 1

1

問題は、ImageListField自体ではなく、ImageListFieldを含むクラスgetFieldWithFocusIndex()のメソッドであるを呼び出していることです。

を含むManager、または、がある場合は、そのオブジェクトにフォーカスのあるフィールドを要求しています。それはおそらく常にあなたのオブジェクトのインデックスを返すでしょう。それはあなたが望まないリスト全体です。そのリスト内ののインデックスが必要です。したがって、別の方法が必要です。ScreenImageListFieldlist

  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ローカル変数にのみ保存すると、後で[削除]メニュー項目を選択したときにオブジェクトで使用できなくなります。

于 2013-01-24T22:04:10.357 に答える