1

libgdx でスクロールペインを使用すると問題が発生します。チャットウィンドウクラスに使用する予定です。Enter キーを押すと、メッセージがウィンドウに追加され、最後に投稿されたメッセージまでスクロールされます..しかし、そうではありません。1 つのメッセージを見逃して、最新のメッセージの前のメッセージにスクロールします。以下に、chatwindow クラスとそれに入力を追加するメソッドを掲載しました。textAreaholder はすべてを保持するテーブルです。chatField は、チャットに投稿する内容を入力する場所です。チャットエリアは、テーブルに追加されるテキストフィールドです。しかし、述べたように..正しくスクロールしません。エラーは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
                }
            }
        }
    });
4

1 に答える 1

2

scrollPane.scrollToCenter(float x, float y, float width, float height)パラメータをゼロで使用しているため、問題が発生する可能性があります。

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

scrollToCenterメソッドでは、パラメーターを正しく指定する必要があります。したがって、メッセージの境界を指定してみてください。

2 番目の理由は、scrollToCentertable がレイアウト自体を実行する前に呼び出すことが原因である可能性があります。したがって、テーブルのlayoutメソッドを上書きしてから呼び出してみscrollToCenterてください。

@Override
public void layout()
{
    super.layout();
    if (new_messages_added)
    {
       scrollPane.scrollToCenter(...)
    }
}
于 2014-02-20T15:10:33.920 に答える