Libgdx: TextField no pierde el foco cuando se hace clic en SelectBox y se expande.

Creado en 28 jul. 2014  ·  3Comentarios  ·  Fuente: libgdx/libgdx

SO: Windows 8.1, x64
gdxVersion: 1.2.0
Orientación: solo escritorio (no probado en otras plataformas)

Cuando hago clic en un SelectBox para que aparezca la lista desplegable; un TextField en la celda de la tabla adyacente debería perder el foco, pero no es así. Estos componentes comparten una mesa y un escenario. La etapa mutua procesa la entrada.

Esto realmente no rompe nada, sin embargo, es un comportamiento no deseado y puede hacer que un juego parezca poco profesional, de todos modos.

Código relevante para reproducir:

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

Comentario más útil

No estoy seguro de que siempre quiera que TextField pierda el foco al hacer clic en otro actor. Puede personalizar el comportamiento usted mismo fácilmente:

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

Todos 3 comentarios

No estoy seguro de que siempre quiera que TextField pierda el foco al hacer clic en otro actor. Puede personalizar el comportamiento usted mismo fácilmente:

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

Bueno, eso ciertamente resuelve el problema. Salud. :-)

Una vez más encontré una elegante solución a mi problema. scene2d es impresionante :)

¿Fue útil esta página
0 / 5 - 0 calificaciones