Реализация автоматического обновления пользовательского интерфейса для Java Jline3 CLIJAVA

Программисты JAVA общаются здесь
Anonymous
 Реализация автоматического обновления пользовательского интерфейса для Java Jline3 CLI

Сообщение Anonymous »

Я пытаюсь использовать библиотеку JLine3, чтобы сделать мой пользовательский интерфейс более отзывчивым, в основном я хотел бы обновить вывод программы с фиксированными интервалами, с входной линией в нижней части терминала. Вот моя текущая реализация класса, ответственная за чтение ввода и вывод: < /p>
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 
происходит перераспределение всего терминала, но я не могу его точно определить. Прежде чем попробовать параллелизм, я попробовал позвонить по дисплее#clear и terminal#flush , но без эффекта.


Подробнее здесь: https://stackoverflow.com/questions/794 ... e3-cli-app

Вернуться в «JAVA»