2016-06-15 4 views
0

ループでテーブルにTextFieldの配列を追加しました。追加されるTextFieldの数は、ユーザーが入力した値によって異なります。
TextFieldはテキスト "Player#"で初期化されます(#はループによって増分されます)。 フォーカスを当てているときに各テキストフィールドからこのテキストを削除したいときに、フォーカスを失ったときに何も入力されなければ元の文字列に戻ります。
私の問題は、TextFieldにアクセスしてFocusListenerのテキストを設定できることです。ここ
は私のコードは次のとおりです。(注:playernamesコードスニペットの外に定義されたテーブルである。)LibGDX:フォーカスのTextFieldのテキストを変更する

for(int i=0; i<MainMenu.numplayers; i++) { 
    playername[i] = new TextField("Player " + (i+1), skin); 
    playernames.add(new Label("Player " + (i+1) + ":", skin, "black")).padRight(5.0F).padBottom(5.0F); 
    playernames.add(playername[i]).width(125.0F).padBottom(5.0F); 
    playernames.row(); 

    playername[i].addListener(new FocusListener() { 
     public void keyboardFocusChanged(FocusListener.FocusEvent event, Actor actor, boolean focused) { 
      if(focused == true) { 
       /** change text to "" */ 
      } 
      else if(focused==false){ 
       /** change text back to "Player #" if nothing was typed */ 
      } 
     } 
    }); 

私はテキストを変更できるようにリスナー内のTextFieldにアクセスするにはどうすればよいですか?

答えて

1

最も単純なオプションは、ループ内のテキストフィールドを保持する最終変数を追加することです。これはハンドラで直接参照することができます。一般的に、匿名クラスの外部変数にアクセスする場合は、それが最終的であることを確認してください。

for(int i = 0; i < MainMenu.numplayers; i++) { 
    final TextField textField = new TextField("Player " + (i+1), skin); 
    playername[i] = textField; 
    // ... 

    textField.addListener(new FocusListener() { 
    public void keyboardFocusChanged(FocusListener.FocusEvent event, Actor actor, boolean focused) { 
     if(focused == true) { 
      // Access textField here and below as needed 
     } 
     else if(focused == false){ 
      // ... 
     } 
    } 
    }); 

} 

...私はイベントで参照俳優がテキストフィールドであるべきだと思うが、このアプローチは、型キャストを必要とします
関連する問題