У меня есть JScrollPane с JTextArea, установленным как его порт представления.Maintaing JTextArea позиция прокрутки
Я обновляю (многострочный) текст, показанный на JTextArea, непрерывно примерно раз в секунду. Каждый раз, когда текст обновляется, JScrollPane проходит до конца текста.
Вместо этого я хотел бы выяснить номер строки, который в настоящее время отображается как первая строка в исходном тексте, и эта строка будет первой строкой, отображаемой при обновлении текста (или если новый текст не имеет столько строк, а затем прокручивается до конца).
Моя первая попытка сделать это, чтобы получить текущую позицию курсора, понять линию, основанную на том, что, а затем установить текстовую область, чтобы показать, что линия:
int currentPos = textArea.getCaretPosition();
int currentLine = 0;
try {
for(int i = 0; i < textArea.getLineCount(); i++) {
if((currentPos >= textArea.getLineStartOffset(i)) && (currentPos < gameStateTextArea.getLineEndOffset(i))) {
currentLine = i;
break;
}
}
} catch(Exception e) { }
textArea.setText(text);
int newLine = Math.min(currentLine, textArea.getLineCount());
int newOffset = 0;
try {
newOffset = textArea.getLineStartOffset(newLine);
} catch(Exception e) { }
textArea.setCaretPosition(newOffset);
Это было почти приемлемо для моих потребностей , но требует, чтобы пользователь щелкнул внутри текстовой области, чтобы изменить положение каретки, так что прокрутка будет поддерживать состояние (что не очень приятно).
Как бы это сделать, используя (вертикальную) позицию прокрутки?
Я только что понял: JTextArea обрабатывает свою прокрутку! Это, вероятно, саботирует наши усилия по управлению внедрением JScrollPane. –
Хорошо, у меня все получилось. См. Мое обновление 2. –