PrintStream 重定向到 SWT 列表

PrintStream redirected to SWT List

我正在制作一个将输出打印到列表的 GUI。

为此,我扩展了 OutputStream class。

import java.io.IOException;
import java.io.OutputStream;
import org.eclipse.swt.widgets.List;

/**
//This class extends from OutputStream to redirect output to a SWT List widget
**/
public class CustomOutputStream extends OutputStream {

    private List list;

    public CustomOutputStream(List list) {
        this.list = list;
    }

    @Override
    public void write(int b) throws IOException {       
        // redirects data to the list
        list.add(String.valueOf((char)b));
        // scrolls the text area to the end of data
        list.select(list.getItemCount() - 1);
        list.showSelection();
        list.deselectAll();
    }
}

main class 中创建列表并将其传递给 CustomOutputStream 的实例。使用 CustomOutputStream 作为参数创建打印流。 System.outSystem.err 设置为使用此打印流。

Public List list = new List(shell, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
Public CustomOutputStream log = new CustomOutputStream(list);
PrintStream ps = new PrintStream(log);
System.setOut(ps);
System.setErr(ps);

数据打印到GUI中的列表,但是每行一个字符! (每个列表项是一个字符)。此外,数据不会像生成到控制台那样打印到列表中,一旦程序完成 运行,它就会立即 "dumped" 全部打印到列表中。我该如何解决这些问题?

您在列表中的每个条目都获得一个字符,因为您正在为写入的每个字符调用 list.add - 每次调用 list.add 都会向列表添加一个新行。您需要更改 write 代码以累积当前行(例如在 StringBuilder 中),直到您看到正在写入的行的结尾,然后添加整行。

用户界面仅在 SWT readAndDispatch 循环 运行 时更新。因此,如果您在用户界面线程中 运行ning 长程序,则在它完成之前不会发生任何事情,因为 readAndDispatch 未被调用。

要解决此问题,您需要 运行 将代码放在单独的线程中,以便用户界面线程可以保持响应。使用 Display.asyncExec 方法从后台线程更新列表。