Libgdx: TextField verliert den Fokus nicht, wenn SelectBox angeklickt und erweitert wird.

Erstellt am 28. Juli 2014  ·  3Kommentare  ·  Quelle: libgdx/libgdx

Betriebssystem: Windows 8.1, x64
gdxVersion: 1.2.0
Ausrichtung: Nur Desktop (nicht auf anderen Plattformen getestet)

Wenn ich auf eine SelectBox klicke, um die Dropdown-Liste anzuzeigen; ein TextField in der angrenzenden Tabellenzelle sollte den Fokus verlieren, tut es aber nicht. Diese Komponenten teilen sich eine Tabelle und eine Bühne. Die gemeinsame Stufe verarbeitet den Input.

Das schadet nicht wirklich, ist aber ein unerwünschtes Verhalten und kann ein Spiel trotzdem unprofessionell aussehen lassen.

Relevanter Code zum Reproduzieren:

    import com.badlogic.gdx.scenes.scene2d.ui.*;

    final Label titleLabel = new Label(
            "Title: ", skin, "heading");

    final Label typeLabel = new Label(
            "Type: ", skin, "heading");

    final TextField textField = new TextField("", skin);

    final SelectBox<String> contextSelector = new SelectBox<String>(skin);
    contextSelector.setItems("Weapon", "Tool", "Crop", "Machine", "World Rule");

    table.row();
        table.add(titleLabel).right();
        table.add(textField).fill().prefWidth(Gdx.graphics.getWidth() / 5.0f).space(1.0f);
    table.row();
        table.add(typeLabel).right();
        table.add(contextSelector).fill().prefWidth(Gdx.graphics.getWidth() / 5.0f).space(1.0f);
    table.row().height(15.0f); table.add().fill();
    table.row();
        table.add(placeHolderLabel1);
        table.add(startButton).right();

Hilfreichster Kommentar

Ich bin mir nicht sicher, ob Sie immer möchten, dass das TextField den Fokus verliert, wenn Sie auf einen anderen Akteur klicken. Sie können das Verhalten ganz einfach selbst anpassen:

stage.getRoot().addCaptureListener(new InputListener() {
    public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
        if (!(event.getTarget() instanceof TextField)) stage.setKeyboardFocus(null);
        return false;
    }
}

Alle 3 Kommentare

Ich bin mir nicht sicher, ob Sie immer möchten, dass das TextField den Fokus verliert, wenn Sie auf einen anderen Akteur klicken. Sie können das Verhalten ganz einfach selbst anpassen:

stage.getRoot().addCaptureListener(new InputListener() {
    public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
        if (!(event.getTarget() instanceof TextField)) stage.setKeyboardFocus(null);
        return false;
    }
}

Nun, das löst das Problem auf jeden Fall. Beifall. :-)

Ich habe mal wieder eine elegante Lösung für mein Problem gefunden. Scene2d ist großartig :)

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen