gpt4 book ai didi

java - 使用 ListView 复制控制台功能

转载 作者:行者123 更新时间:2023-11-30 07:49:18 25 4
gpt4 key购买 nike

我很抱歉想不出一个更具描述性的标题。

我已经通过我自己的 OutputStream 类 Console 将 system.out 重定向到一个新的 ListView:

public class Console extends OutputStream {

private ListView<String> output;

public Console(ListView<String> output) {
this.output = output;
}

private void addText(String str) {
Platform.runLater( () -> output.getItems().add(str) );
}

@Override
public void write(int b) throws IOException {
addText(String.valueOf((char) b));
}

@Override
public void write(byte[] b, int off, int len) throws IOException {
addText(new String(b, off, len));
}

@Override
public void write(byte[] b) throws IOException {
write(b, 0, b.length);
}

}

在这里,我在我的 Controller 类中创建了控制台。 output 是名称 我的 FXML 中的 ListView:

private void buildConsole() {
Console console = new Console(output);
PrintStream ps = new PrintStream(console, true);
System.setOut(ps);
System.setErr(ps);
}

这是我使用事件处理程序测试输出的地方,该事件处理程序打印我的鼠标悬停在其上的图 block 坐标:

tile.setOnMouseEntered(e -> {
tile.setFill(hoverColor);
showConnections(tile);
gridController.getCoordinateLabel().setText(tile.getVertex().toString());
System.out.print("Tile " + tile.getVertex().toString() + " selected.");
});

请注意,我使用的是 System.out.print() 而不是 println()。这是输出:

system.out.print

如果我要使用 println():

system.out.println

我理想的行为是:system.out.print() - 要添加到同一行的文本。system.out.println() - 添加到下一个单元格的文本。

最佳答案

由于您正在寻找对应于系统或 IDE 控制台的行为,因此部分对应于在换行符处将输出拆分为逻辑单元(即“行”)。如果您只是收集所写的任何内容并将其附加到文本区域,那将自动发生,因此我鼓励您尝试一下并看看。即使结果证明它效率较低,但对于您的目的而言它可能仍然非常有效。

但是,如果您想继续使用 ListView,那么您的 Console 类需要在内部缓冲 写入的数据、扫描换行符并分解在换行符处输出到单元格中。它在看到换行符时创建一个新单元格,并且在这种情况下包括所有缓冲文本,但不包括该换行符。


更新:

ByteArrayOutputStream 将成为一个很好的缓冲区。像这样的东西,例如:

public class Console extends OutputStream {

private ListView<String> output;

private ByteArrayOutputStream buffer = new ByteArrayOutputStream();

public Console(ListView<String> output) {
this.output = output;
}

private void addText() throws IOException {
String text = buffer.toString("UTF-8");
buffer.reset();
Platform.runLater( () -> output.getItems().add(text) );
}

@Override
public void write(int b) throws IOException {
if (b == '\n') {
addText();
} else {
buffer.write(b);
}
}

@Override
public void write(byte[] b, int off, int len) throws IOException {
int bound = off + len;
for (int i = off; i < bound; i++) {
if (b[i] == '\n') {
buffer.write(b, off, i - off);
addText();
off = i + 1;
}
}
assert(off <= bound);
buffer.write(b, off, bound - off);
}

@Override
public void write(byte[] b) throws IOException {
write(b, 0, b.length);
}

@Override
public void flush() throws IOException {
// outputs all currently buffered data as a new cell, without receiving
// a newline as otherwise is required for that
addText();
}

@Override
public void close() throws IOException {
flush();
buffer.close();
}
}

关于java - 使用 ListView 复制控制台功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48589410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com