Проблема с полосой прокрутки в libgdx для класса окна чата

У меня проблема с использованием полосы прокрутки в libgdx. Это будет использоваться для класса окна чата. Когда вы нажмете Enter, сообщение будет добавлено в окно, и вы перейдете к последнему опубликованному сообщению. Он пропускает одно сообщение и прокручивает его до последнего сообщения. Ниже я опубликовал класс chatwindow и метод, который добавляет в него входные данные. Держатель textArea - это таблица, в которой хранится все. ChatField - это место, где вы вводите то, что хотите опубликовать в чате. Chatarea - это текстовое поле, которое затем добавляется в таблицу. Но, как уже говорилось... он не прокручивается должным образом, ошибка правильно лежит где-то в методе keyTyped.

public ChatWindow(final Pipe<String> chatPipe) {
    this.chatPipe = chatPipe;
    messageFieldCounter = 0;

    white = new BitmapFont(Gdx.files.internal("fonts/ChatWindowText.fnt"), false);
    fontSize = white.getLineHeight();
    white.scale(TEXT_SCALE);
    final TextFilter filter = new TextFilter();

    /* Making a textfield style */
    textFieldStyle = new TextFieldStyle();
    textFieldStyle.fontColor = Color.WHITE;
    textFieldStyle.font = white;
    textFieldStyle.focusedFontColor = Color.CYAN;

    /*Area where all chat appears*/
    textAreaHolder = new Table();
    textAreaHolder.debug();

    /*Applies the scrollpane to the chat area*/
    scrollPane = new ScrollPane(textAreaHolder);
    scrollPane.setForceScroll(false, true);
    scrollPane.setFlickScroll(true);
    scrollPane.setOverscroll(false, false);

    /*Input chat*/
    chatField = new TextField("", textFieldStyle);
    chatField.setTextFieldFilter(filter);

    /*Tries to make the textField react on enter?*/
    chatField.setTextFieldListener(new TextFieldListener() {
        @Override
        public void keyTyped(final TextField textField, final char key) {
            if (key == '\n' || key == '\r') {
                if (messageFieldCounter <= 50) {
                    textAreaHolder.row();
                    StringBuilder message = new StringBuilder();   //Creates the message
                    message.append(chatField.getText());           //Appends the chatfield entry
                    TextArea chatArea = new TextArea(message.toString(), textFieldStyle); //Creates a chatArea with the message
                    chatArea.setHeight(fontSize + 1);
                    chatArea.setDisabled(true);
                    chatArea.setTextFieldFilter(filter);
                    textAreaHolder.add(chatArea).height(CHAT_INPUT_HEIGHT).width(CHAT_WIDTH);

                    scrollPane.scrollToCenter(0, 0, 0, 0);



                      //Scrolls to latest input


                chatField.setText("");
                //InputDecider.inputDecision(message.toString(), chatPipe); //TODO: Change the filter
                //chatPipe.put(message.toString()); //TODO: testing
                }
            }
        }
    });

1 ответ

Проблемы могут возникнуть, потому что вы используете scrollPane.scrollToCenter(float x, float y, float width, float height) с нулевыми параметрами:

scrollPane.scrollToCenter(0, 0, 0, 0);

scrollToCenter Метод требует, чтобы параметры были предоставлены правильно. Итак, попробуйте указать границы сообщения.

Вторая причина может быть потому, что вы звоните scrollToCenter перед таблицей сделай макет сам. Итак, попробуйте переписать таблицу layout метод и вызов scrollToCenter после:

@Override
public void layout()
{
    super.layout();
    if (new_messages_added)
    {
       scrollPane.scrollToCenter(...)
    }
}
Другие вопросы по тегам