我正在制作一个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.out
和System.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的列表中,但每行有一个字符! (每个列表项是一个字符)。此外,数据不会打印到列表中,因为它的生成方式与控制台一样,它是"转储"程序完成运行后立即进入列表。我该如何解决这些问题?
答案 0 :(得分:0)
您在列表中每个条目获得一个字符,因为您为每个写入的字符调用list.add
- 每次调用list.add
都会在列表中添加一个新行。您需要更改write
代码以累积当前行(例如,在StringBuilder
中),直到您看到正在写入的行尾,然后添加整行。)
仅在SWT readAndDispatch
循环运行时更新用户界面。因此,如果您在用户界面线程中运行长程序,则在完成之前不会发生任何事情,因为未调用readAndDispatch
。
要解决此问题,您需要在单独的线程中运行代码,以便用户界面线程可以保持响应。使用Display.asyncExec
方法从后台线程更新列表。