2016-08-23 2 views
0

В моем приложении я добавляю текст в TextArea каждые 2 минуты. Когда я добавляю новую строку в TextArea, автоматически прокручивается автоматически вниз. Но я хочу оставить свиток, где я держу кнопку прокрутки. Как это сделать в JavaFX.Как управлять автоматическим прокруткой JavaFX TextArea?

logTextArea.appendText("Here i am appending text to text area"+"\n"); 
logTextArea.setScrollTop(Double.MIN_VALUE); 

Я попытался это, но прокручиваться автоматически собираюсь вниз, но мне нужно, чтобы мой свиток выбрал позицию, я не хочу идти автоматически вниз.

Как это сделать?

ответ

0

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

logTextArea.textProperty().addListener(new ChangeListener<Object>() { 
    @Override 
    public void changed(ObservableValue<?> observable, Object oldValue, Object newValue) { 
     logTextArea.setScrollTop(Double.MIN_VALUE); //this will scroll to the top 
    } 
}); 

Теперь, когда вы logTextArea.appendText("Here i am appending text to text area"+"\n"); к TextArea, она должна оставаться на вершине.

Идея взята из: JavaFX TextArea and autoscroll

+0

где мне нужно добавить этот? означает класс класса контроллера или расширенный класс Application @ user2882590 – epn

+0

У вас есть класс контроллера, в котором вы объявили свой TextArea. Если я правильно помню, в 'public void initialize()' функция вы можете добавить этого слушателя в 'logTextArea', если он исходит из файла fxml. Если нет, то вы можете просто добавить этого слушателя после его создания. поэтому после: 'TextArea logTextArea = new TextArea();' – sundri23

+0

Хорошо, но мой вопрос заключается в добавлении текста в текстовую область. Я прокручиваю свою кнопку до середины, после этого, когда я добавляю текст, кнопка прокрутки не будет подниматься вверх. нужно оставаться в середине, только хочу этого. Как я могу сделать ? – epn

1

Самый простой путь запомнить положение кареткой и восстановить его после того, как она будет тронута appendText или setText.

Вот как вы можете это сделать:

int caretPosition = area.caretPositionProperty().get(); 
area.appendText("Here i am appending text to text area"+"\n"); 
area.positionCaret(caretPosition); 
+0

Это работало при использовании в цикле для appendText. –

0

Вы можете написать свою собственную функцию для добавления текста. В этом методе вы можете использовать setText, а не appendText, так как appendText автоматически прокручивается до конца содержимого (setText прокручивает к началу, но это может быть подавлено, установив обратно scrollTopProperty в его предыдущее значение).

Пример

public class Main extends Application { 
    @Override 
    public void start(Stage primaryStage) { 
     try { 
      BorderPane root = new BorderPane(); 
      Scene scene = new Scene(root,400,400); 

      TextArea ta = new TextArea(); 
      root.setCenter(ta); 
      Button button = new Button("Append"); 
      button.setOnAction(e -> { 
       appendTextToTextArea(ta, "BlaBlaBla\n"); 
      }); 
      root.setBottom(button); 

      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 


    /** 
    * Appends text to the end of the specified TextArea without moving the scrollbar. 
    * @param ta TextArea to be used for operation. 
    * @param text Text to append. 
    */ 
    public static void appendTextToTextArea(TextArea ta, String text) { 
     double scrollTop = ta.getScrollTop(); 
     ta.setText(ta.getText() + text); 
     ta.setScrollTop(scrollTop); 
    } 
} 

Примечание:

В качестве альтернативы вы можете также расширить TextArea и перегрузки appendText, чтобы быть в состоянии определить, хотите ли вы, чтобы переместить полосу прокрутки:

public class AppendableTextArea extends TextArea { 

    public void appendText(String text, Boolean moveScrollBar) { 
     if (moveScrollBar) 
      this.appendText(text); 
     else { 
      double scrollTop = getScrollTop(); 
      setText(getText() + text); 
      setScrollTop(scrollTop); 
     } 
    } 
} 

и использование:

AppendableTextArea ta = new AppendableTextArea(); 
ta.appendText("BlaBlaBla\n", false);