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