libgdx ScrollPane — не прокручивается?

Я делаю лобби в многопользовательской игре, в которой может отображаться любое количество игроков в таблице. У меня есть следующий код:

camera = new OrthographicCamera(WIDTH,HEIGHT);
    camera.position.set(WIDTH/2,HEIGHT/2, 0);
    camera.update();

    stage = new Stage();
    Gdx.input.setInputProcessor(stage);
    stage.setCamera(camera);
    stage.setViewport(WIDTH,HEIGHT,false);

    ScrollPaneStyle paneStyle = new ScrollPaneStyle();
    paneStyle.background = new TextureRegionDrawable(WizardsDuel.atlas.findRegion("cavebg"));
    paneStyle.vScrollKnob = new TextureRegionDrawable(WizardsDuel.atlas.findRegion("GUI/slidernob"));
    paneStyle.hScroll = paneStyle.hScrollKnob = paneStyle.vScroll = paneStyle.vScrollKnob;

    Table container = new Table();
    table = new Table();
    ScrollPane pane = new ScrollPane(table,paneStyle);
    container.add(pane).width(WIDTH).height(HEIGHT);
    container.row();
    container.setBounds(0,0,WIDTH,HEIGHT);
    stage.addActor(container);

    font = new BitmapFont();
    color = new Color(0,0,0,1);
    style = new TextButtonStyle();
    style.font = font;
    style.up = new TextureRegionDrawable(WizardsDuel.atlas.findRegion("GUI/guibg"));
    style.fontColor = color;

    handler = new ChangeHandler();
    ArrayList<User> users = FirebaseManager.lobbyUsers;
    for(int i = 0; i < users.size() || i < 100; i++){
        TextButton tmp = new TextButton("",style);
        tmp.scale(2);
        //tmp.setText(users.get(i).name);
        tmp.setText(i+ "   asdf");
        tmp.addListener(handler);
        table.add(tmp).width(WIDTH/4f);
        if(i%2 == 1 && i > 0)
            table.row();
    }

Несмотря на то, что таблица явно простирается ниже нижней части экрана (которая должна быть нижней частью панели прокрутки), полоса прокрутки отсутствует, а щелчок и перетаскивание ничего не делают.

Скриншот: введите здесь описание изображения


person csga5000    schedule 01.08.2013    source источник


Ответы (4)


возможно, вы забыли сделать сцену в render(), добавьте что-то вроде:

@Override
public void render(float delta) {
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

    stage.act(Math.min(Gdx.graphics.getDeltaTime(), 1 / 30f));
    stage.draw();
}
person Jason Wang    schedule 28.11.2013

На самом деле вам нужны две вещи. Внешний Контейнер и внутренний Контейнер. Вы регулярно используете две таблицы для этого. Итак, вот небольшой пример того, как я использую scrollPane. На самом деле без стиля, но это должно прояснить ситуацию.

this.table = new Table();
this.container = new Table();
scroll = new ScrollPane(table);
container.add(scroll).width(500f).height(500f);
container.row();

Таблица — это таблица, в которую вы добавляете материал, который должен быть прокручиваемым. Контейнер — это внешняя коробка. Таким образом, вы можете добавить, например, заголовок над полем прокрутки. Внешней коробке (контейнеру) нужен размер. В противном случае у вас не будет полос прокрутки или чего-то подобного. И вам нужен внутренний стол.

Простой пример добавления:

style = new LabelStyle(font, Color.WHITE);
label = new Label(null, style);
table.add(label);
table.row();
label.setAlignment(1); // align center

дайте ему больше строк, которые он может показать, и у вас будет панель прокрутки. В противном случае нет полосы прокрутки или чего-то подобного.


Все в одном. Я думаю, вы просто пропустили внешний контейнер. Добавьте его, и он должен работать. Не забудьте указать размеры.

person BennX    schedule 01.08.2013
comment
Кроме того, откуда вы взяли Config.VIRTUAL_VIEW_WIDTH? - person csga5000; 01.08.2013
comment
... это статический поплавок, который я использую в своей программе. Замените его на какое-то значение - person BennX; 01.08.2013
comment
Я сделал, я использовал статическое поле с именем WIDTH. Я собираюсь отредактировать свой пост, чтобы он показывал контейнер - person csga5000; 01.08.2013
comment
Добавлю скриншот. - person csga5000; 01.08.2013
comment
вы пытались прокрутить вниз? просто зажав мышку..может просто стиль не работает. остальное выглядит правильно, я думаю - person BennX; 01.08.2013
comment
Да, я видел, но я только что понял кое-что. Кнопки не работают, как я и ожидал. Возможно, моя сцена неправильно распределяет/принимает ввод... Я настроил процессор ввода... И вы можете скачать настольную версию здесь: hobogames.atspace.cc (Просто нажмите на Wizard Wars, загрузите настольную версию и посмотрите сами, что случилось (это меню PvP) - person csga5000; 01.08.2013
comment
Контейнер в контейнере — отличный способ управлять областью прокрутки. Я использую таблицу, затем помещаю свою область прокрутки в ячейку таблицы, а затем добавляю туда содержимое. - person Scuba Steve; 24.08.2014

Моя проблема заключалась в том, что я не получал ввод. Я не должен был устанавливать процессор ввода в конструкторе, потому что предыдущий экран устанавливал процессор на нуль, когда он был «скрыт», поэтому, когда я переместил строку в метод показа LobbyScreen, это произошло после того, как предыдущий экран был скрыт , и ввод установлен правильно.

person csga5000    schedule 01.08.2013

после того, как вы запустите панель прокрутки, вы должны сначала вызвать это

    mScrollPane.layout();
person junfeng    schedule 28.09.2013