cliview < /h2>
Код: Выделить всё
package org.mga44.timer.adapter.view.cli;
import lombok.SneakyThrows;
import org.jline.reader.LineReader;
import org.jline.reader.LineReaderBuilder;
import org.jline.reader.impl.history.DefaultHistory;
import org.jline.terminal.Size;
import org.jline.terminal.Terminal;
import org.jline.terminal.TerminalBuilder;
import org.jline.utils.AttributedString;
import org.jline.utils.Display;
import org.mga44.timer.adapter.view.View;
import java.util.Arrays;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
public class CliView implements View {
private final Display display;
private final Terminal terminal;
private final LineReader reader;
private volatile String latestOutput = "Welcome!";
private int lastLineCount = 0;
private final int width = 100;
private final int height = 10;
private final Size displaySize = new Size(width, height);
@SneakyThrows
public CliView() {
this.terminal = TerminalBuilder.builder()
.system(true)
.build();
this.reader = LineReaderBuilder.builder()
.terminal(terminal)
.history(new DefaultHistory())
.option(LineReader.Option.ERASE_LINE_ON_FINISH, true)
.build();
this.display = new Display(terminal, false);
display.resize(height, width);
display.clear();
startAutoRefresh();
}
@Override
public void write(String content) {
latestOutput = content;
refreshDisplay();
}
@Override
public String read() {
return reader.readLine("> ");
}
private void startAutoRefresh() {
Timer t = new Timer(true);
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
refreshDisplay();
}
}, 0, 1000);
}
private void refreshDisplay() {
List lines = Arrays.stream(latestOutput.split("\n"))
.map(AttributedString::new)
.toList();
int newLineCount = lines.size();
if (newLineCount < lastLineCount) {
for (int i = 0; i < (lastLineCount - newLineCount); i++) {
lines.add(new AttributedString(" "));
}
}
lastLineCount = newLineCount;
display.resize(height, width);
display.update(lines, displaySize.cursorPos(height, 0));
display.clear();
terminal.flush();
}
}
< /code>
Также я использую ниже версии соответствующих зависимостей: < /p>
build.gradle
implementation 'org.jline:jline:3.21.0'
implementation 'net.java.dev.jna:jna:5.12.1'
< /code>
Проблема, с которой я борюсь, заключается в том, что в настоящее время мне приходится вручную нажать Enter, чтобы обновить выход приложения. Я подозреваю, что где -то в реализации LineReader#Readline Подробнее здесь: https://stackoverflow.com/questions/794 ... e3-cli-app