2016-04-17 5 views
1

Ich glaube nicht, dass mein Problem ist so schwer zu lösen, aber ich habe eine Weile gesucht und kann es nicht herausfinden.In LibGDX scene2d, nach dem Ändern der Elemente einer Selectbox, hat es nicht mehr ein Standard-Listener

Ich habe zwei scene2d SelectBox Widgets übereinander, in einer Tabelle, auf einer Bühne. Nennen wir sie A und B. Was in A ausgewählt ist, bestimmt, welche Liste in B angezeigt wird. Ich implementiere dies mit einem ChangeListener auf A und alles funktioniert gut (das ist nicht das Problem).

Allerdings wurde meine Liste A sehr lang (500+ Elemente), also wollte ich eine TextField darüber hinzufügen, die die Strings suchen und anpassen würde, die alte Liste von A durch eine kürzere ersetzen, was es viel einfacher macht um zu finden, nach was Sie suchen. Das funktioniert gut, ich benutze ChangeListener auf dem Textfeld, um die Zeichenfolge zu erhalten, vergleichen Sie es mit einer Hauptliste von Zeichenfolgen mit einer for-Schleife und verwenden aList.setItems();, um die angepasste Zeichenfolge an die SelectBox hinzuzufügen. Die Liste wird angezeigt (ohne einen Klick, also verwende ich aList.showList(); in der ChangeListener der TextField) und ich denke, das ist, wo das Problem auftritt - anstelle von einem Klick wird von anderswo aufgerufen. Nehmen wir an, ich ändere meine Meinung und möchte ein anderes Element als A auswählen, es wird nicht länger das Menü bei Klick verlassen. Wenn ich jedoch den Text in der Suchleiste ändere, wird die Liste angezeigt. Wenn die Liste angezeigt wird, kann ich auf ein Element klicken und es wird wie üblich ausgeblendet.

Dies könnte scheint ein wenig verwirrend, also hier ist der Code (der Klarheit halber bearbeitet, so dass, wenn etwas fehlt lassen Sie mich wissen)

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

} 

ich folgende Hörer zu sagen, hinzugefügt, wenn die Auswahlbox angeklickt wurde (was es war). Ich habe allen Schauspielern Namen gegeben

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

Der Klick wird erkannt, nur die Liste wird nicht angezeigt. Meiner Meinung nach ist es ein Problem mit aufrufen und die Liste zur gleichen Zeit ändern.

Jede Hilfe ist willkommen, und wenn Sie mehr Code oder andere Informationen benötigen, lassen Sie es mich wissen.

Dank

Antwort

1

eine feste Größe auf die Auswahlbox gesetzt, wenn es auf den Tisch, so etwas wie

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

oder

table.add(selectBox).growX(); 

Auch das Hinzufügen, nachdem Sie den Code überprüft, empfehle ich Ihnen entfernen

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

Und machen ArrayList nur libgdx Array < String>, es wird die Dinge einfacher, wird keine Zuordnung bei der Iteration mit ":" verursachen und Sie werden .toArray() beim Einstellen der Elemente Ihrer Selectboxen nicht benötigen. Sie können auch den SelectBox-Typ mit SelectBox < String> festlegen, und Sie können eine Zeile in derselben Zeile mit table.add (something) .row() hinzufügen.

Nach dem Ändern der Größe der Selectbox-Zelle funktionierte Ihr Code in meiner Seite gut.

+0

Ich denke, es war der clearItems Teil, der die Probleme verursachte, ich nahm nur an, dass die Liste vor der Aktualisierung gelöscht werden müsste. Ich entfernte das und alles funktioniert gut, ich hatte bereits eine Breite, die ich gerade vergessen habe, den Code einzuschließen. Danke für Ihre Hilfe.Danke auch für den Tipp zur libgdx Array-Klasse, ich wusste gar nicht, dass es einen gab. – EssEllDee

+0

Ja, ich bin froh zu helfen, libGDX ist ein RIESIGES Framework, ich benutze es seit ungefähr 4 Jahren, und immer noch gibt es eine Menge Dinge zu lernen –

Verwandte Themen