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
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
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 –