2014-02-20 55 views
1

我在使用libgdx中的滾動窗格時遇到了問題。它將被用於chatwindow類。當你按下輸入的消息將被添加到窗口,你會滾動到最新發布的消息..但它沒有。它錯過了一條消息,並滾動到最近的消息之前。下面我已經發布了chatwindow類和添加輸入的方法。 textAreaholder是一個包含所有內容的表格。 chatField是您要輸入聊天內容的地方。 chatarea是隨後被添加到表格中的文本字段。但正如所聲明的,它不正確的滾動,錯誤正確地位於keyTyped方法的某處。可能發生針對chatwindow類的Libgdx滾動窗格問題

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

回答

2

問題,因爲您使用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(...) 
    } 
}