Прокрутка терминала, менее похожая на Unix, в Java

По умолчанию, если выводится много текста, терминал прокручивается до самой последней строки, а затем пользователю приходится прокручивать до конца, чтобы читать сверху. Мне нужен Java-подобный способ реализации прокрутки, предлагаемой в программе Unix "less". Я хотел бы выводить много текста, и пользователь мог бы начать сверху и прокручивать вниз в своем темпе.


person Mohit Deshpande    schedule 05.06.2011    source источник
comment
Что доставляет вам неприятности? Подсчет строк? Определение высоты терминала? Перехватывать весь вывод в STDOUT, не пропуская ни одного? Распознавание клавиш курсора для прокрутки?   -  person Kilian Foth    schedule 05.06.2011
comment
У меня проблемы с кэшированием строки в стандартный вывод и обрезанием текста по высоте терминала. Я также не знаю, как настроить так, чтобы при нажатии пользователем на стрелку вниз появлялась следующая строка, а при нажатии на стрелку вверх появлялась предыдущая строка   -  person Mohit Deshpande    schedule 05.06.2011
comment
Я не думаю, что это возможно. Я даже не думаю, что вы можете захватить нажатие клавиши с терминала в Java (для страницы вверх/вниз или строки). Вам нужно перейти на графический интерфейс.   -  person toto2    schedule 05.06.2011
comment
Я сомневаюсь, что вы можете сделать это независимым от платформы способом. Написать программу, подобную more, намного проще.   -  person Fred Foo    schedule 05.06.2011
comment
Язык, который даже не позволяет вам мыслить злые мысли, очевидно, является хорошим языком. Теперь никто и никогда не посчитает злом. Как удобно.   -  person tchrist    schedule 05.06.2011


Ответы (1)


Это не реализация Less, но вот идея:

  • Разделите вывод на несколько частей: очень длинная строка => массив коротких строк (~ 10-15 строк);
  • Сделайте цикл, ожидая ввода пользователя, чтобы отобразить следующую итерацию
String s = "blahhh foo.... I'm a very long string, with long lines and
a lot of linebreaks...";

String[] looping = s.split("\n"); // whatever delimiter you need

for(int i = 0 ; i < looping.length ; i++) {
  // print 
  System.out.print(looping[i]);

  // wait for user input
  Scanner scanner = new Scanner(System.in);
  String a =  scanner.nextLine(); 

  // assigne a key to stop the loop before the end
  if(a.equalsIgnoreCase("X") // X, or whatever you want
  break;
}
person mw4rf    schedule 03.08.2011