2016-04-17 14 views
1

私の問題は解決するのは難しいとは思っていませんが、しばらく検索しています。LibGDX scene2dでは、選択ボックスの項目を変更した後、デフォルトのリスナーがなくなりました

私は2つのscene2d SelectBoxウィジェットをテーブルの上にステージ上に重ねて配置しています。それらをAとBとしましょう。Aで選択されているものはBに表示されるリストを決定します。これはAにChangeListenerを使用して実装し、すべて正常に動作します(これは問題ではありません)。

しかし、私のリストAは非常に長くなっていたので(500以上のアイテム)、これよりもTextFieldを追加して、文字列を検索して一致させたい場合は、古いリストを短いものに置き換えて、あなたが探しているものを見つける。これは正常に動作しますが、テキストフィールドにChangeListenerを使用して文字列を取得し、forループを使用して文字列のメインリストと比較し、SelectBoxに調整済みの文字列を追加するためにaList.setItems();を使用します。リストは表示されます(クリックなしで、私はTextFieldChangeListeneraList.showList();を使用しています)、これはどこかで問題が発生する場所だと思います - クリックの代わりにshowList()が他の場所から呼び出されます。私は自分の考えを変え、Aから別のアイテムを選択したいと言うと、もはやクリック時にメニューをドロップしなくなります。しかし、検索バーにあるテキストを変更すると、リストが表示されます。リストが表示されているときは、アイテムをクリックすると通常どおりに非表示になります。

これかもしれないので、ここで、少し混乱と思われるコードです(わかりやすくするために編集するので、何かが欠落している場合、私に知らせて)選択ボックスがクリックされた場合

SelectBox aSelect, bSelect; 
TextField searchBar; 
Stage stage; 
Table table; 
Skin skin; 

ArrayList<String> completeAList; 
ArrayList<String> abrevAList; 

public chooseItemScreen() 
{ 
    stage = new Stage(new ScreenViewport()); 
    skin = new Skin(Gdx.files.internal("uiskin.json")); 
    table = new Table(); 
    table.setFillparent(true); 

    completeAList = new ArrayList<String>; 
    abrevAList = new ArrayList<String>; 

    aSelect = new SelectBox(skin); 
    //ItemList is a class with the list of strings as a static method 
    completeAList = ItemList.getAList(); 
    aSelect.setItems(completeAList.toArray()); 

    //bSelect omitted as is same as A 
    //aSelect changeListener also omitted as it is working fine 

    searchBar = new TextField("", skin); 
    searchBar.setMessageText("SEARCH LIST"); 

    searchPokemon.addListener(new ChangeListener() { 
     @Override 
     public void changed(ChangeEvent event, Actor actor) { 
      updateASelect(); 
     } 
    }); 

    table.add(searchBar); 
    table.row(); 
    table.add(aList); 

    stage.addActor(table); 

    Gdx.input.setInputProcessor(stage); 

} 

private void updateAList() 
{ 
    abrevAList.clear(); 
    aSelect.clearItems(); 
    aSelect.hideList() 

    for (String string: completeAList) 
    { 
     if (string.toLowerCase().startsWith(searchBar.getText().toLowerCase())) 
     { 
      abrevAList.add(string); 
     } 
    } 

    if (abrevAList.isEmpty()) 
    { 
     abrevAList.add("NOT FOUND"); 
    } 

    aSelect.setItems(abrevAList.toArray()); 

    //It's at this point where I am no longer to click on aSelect 
    //I can still select an item from the drop down list, closing the list 
    //it's just I can't show list by clicking on the widget after that 

    aSelect.showList(); 
} 

@Override 
public void render(float delta) { 
    Gdx.gl20.glClearColor(0,0,0,0); 
    Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT); 

    stage.act(); 
    stage.draw(); 

} 

は、私が言うには、次のリスナーを追加しました(これはそれだった)。私はすべての俳優の名前を与えた

stage.getRoot().addCaptureListener(new InputListener() { 
     public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { 
      System.out.println(event.getTarget().getName()); 
      return false; 
     } 
    }); 

クリックは認識され、リストは表示されません。私の意見では、それはshowList()を呼び出すと同時にリストを変更することで問題になります。

何か助けていただきありがとうございます、より多くのコードやその他の情報が必要な場合はお知らせください。

おかげ

答えて

1

、テーブルに

table.add(selectBox).width(someValue); 

あるいはまた

table.add(selectBox).growX(); 

のようなものを、それを追加する際に選択ボックスに固定サイズを設定して、あなたのコードを見直した後、私はあなたを示唆します削除するには

aSelect.clearItems(); 
    aSelect.hideList(); 

ArrayListをlibgdx Array < String>にすると、「:」で反復処理するときに、より簡単になり、割り当てが行われず、選択ボックスの項目を設定するときに.toArray()が不要になります。またSelectBoxの型をSelectBox < String>で設定し、table.add(something).row()を使用して同じ行に行を追加することもできます。

選択ボックスのセルのサイズを変更した後、コードは私の側でうまく機能しました。

+0

問題を引き起こしていたのはclearItemsの部分だと思っていましたが、私はリストを更新する前にクリアする必要があると仮定しました。私はそれを削除し、すべてうまく動作し、私はすでにコードを含めることを忘れて幅があった。ご協力ありがとうございました。libgdxのArrayクラスに関するヒントもありがとうございました。 – EssEllDee

+0

嬉しいことに、libGDXは巨大なフレームワークです。私はこれを約4年間使用していますが、まだ学習することがたくさんあります –

関連する問題