PrintStream重定向到SWT列表

时间:2015-09-22 18:07:48

标签: java list swt outputstream

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

为此,我扩展了OutputStream类。

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类中,创建列表并将其传递给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的列表中,但每行有一个字符! (每个列表项是一个字符)。此外,数据不会打印到列表中,因为它的生成方式与控制台一样,它是"转储"程序完成运行后立即进入列表。我该如何解决这些问题?

1 个答案:

答案 0 :(得分:0)

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

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

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