Libgdx: TextField не теряет фокус при нажатии и раскрытии SelectBox.

Созданный на 28 июл. 2014  ·  3Комментарии  ·  Источник: libgdx/libgdx

ОС: Windows 8.1, x64
gdx Версия: 1.2.0
Таргетинг: только настольный компьютер (на других платформах не тестировался)

Когда я нажимаю SelectBox, чтобы открыть раскрывающийся список; TextField в соседней ячейке таблицы должен потерять фокус, но этого не происходит. Эти компоненты имеют общую таблицу и сцену. Взаимный этап обрабатывает ввод.

На самом деле это ничего не ломает, но это нежелательное поведение, которое может придать игре непрофессиональный вид.

Соответствующий код для воспроизведения:

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

Самый полезный комментарий

Я не уверен, что вы всегда хотите, чтобы TextField терял фокус при нажатии на другого актера. Вы можете легко настроить поведение самостоятельно:

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

Все 3 Комментарий

Я не уверен, что вы всегда хотите, чтобы TextField терял фокус при нажатии на другого актера. Вы можете легко настроить поведение самостоятельно:

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

Что ж, это, безусловно, решает проблему. Ваше здоровье. :-)

Я снова нашел изящное решение своей проблемы. scene2d потрясающе :)

Была ли эта страница полезной?
0 / 5 - 0 рейтинги