实现输出从控制台到GUI并不复杂只需要将标准输出重定向
重定向标准输出很easySystem 类里有两个静态方法setErr(PrintStream err) 和 setOut(PrintStream out) 分别用于重定位标准错误输出流和标准输出流只需要在程序初始时设置即可
// GUIPrintStream guiPrintStream = new GUIPrintStream(Systemout jTextArea);
SystemsetErr(guiPrintStream);
SystemsetOut(guiPrintStream);
在上面的代码中我们发现一个新的类 GUIPrintStream这是我们为 PrintStream 所做的包装因为我们的输出目标位置是GUI所以需要在 PrintStream 上做些文章大家请看下面 GUIPrintStream 的代码
Java代码
/**//*
* To change this template choose Tools | Templates
* and open the template in the editor
*/
import javaioOutputStream;
import javaioPrintStream;
import javaxswingSwingUtilities;
import javaxswingtextJTextComponent;
/** *//**
* 输出到文本组件的流
*
* @author Chen Wei
* @website wwwchenweimobi
* @email chenw
*/
public class GUIPrintStream extends PrintStream{
private JTextComponent component;
private StringBuffer sb = new StringBuffer();
public GUIPrintStream(OutputStream out JTextComponent component){
super(out);
ponent = component;
}
/** *//**
* 重写write()方法将输出信息填充到GUI组件
* @param buf
* @param off
* @param len
*/
@Override
public void write(byte[] buf int off int len) {
final String message = new String(buf off len);
SwingUtilitiesinvokeLater(new Runnable(){
public void run(){
sbappend(message);
componentsetText(sbtoString());
}
});
}
}
/**//*
* To change this template choose Tools | Templates
* and open the template in the editor
*/
import javaioOutputStream;
import javaioPrintStream;
import javaxswingSwingUtilities;
import javaxswingtextJTextComponent;
/** *//**
* 输出到文本组件的流
*
* @author Chen Wei
* @website wwwchenweimobi
* @email chenw
*/
public class GUIPrintStream extends PrintStream{
private JTextComponent component;
private StringBuffer sb = new StringBuffer();
public GUIPrintStream(OutputStream out JTextComponent component){
super(out);
ponent = component;
}
/** *//**
* 重写write()方法将输出信息填充到GUI组件
* @param buf
* @param off
* @param len
*/
@Override
public void write(byte[] buf int off int len) {
final String message = new String(buf off len);
SwingUtilitiesinvokeLater(new Runnable(){
public void run(){
sbappend(message);
componentsetText(sbtoString());
}
});
}
}
类 GUIPrintStream继承自 PrintStream 并且对它进行了一些修改
GUIPrintStream 在构造函数中增加了一个 JTextComponent 变量它就是我们的目标输出 GUI 组件它规定了目标输出组件是一个文本组件接下来覆写了 write(byte[] buf int off int len)方法这个方法原来的作用是将 len 字节从指定的初始偏移量为 off 的 byte 数组写入此流现在经过我们的修改变成了将 byte 数组包装成 String 写入目标 GUI 组件
简单的代码完成了将标准输出重定向到 GUI 的全过程由此延伸还可以将标准输出重定向到文本文件从GUI获取标准输入等就不一一介绍
测试
Java代码
public class MainFrame extends javaxswingJFrame {
public MainFrame() {
initComponents();
// 重定向到通过文本组件构建的组件输出流中
SystemsetOut(new GUIPrintStream(Systemout textArea));
}
private void initComponents() {
scrollPane = new javaxswingJScrollPane();
textArea = new javaxswingJTextArea();
btnOut = new javaxswingJButton();
setDefaultCloseOperation(javaxswingWindowConstantsEXIT_ON_CLOSE);
setTitle(标准输出重定向到GUI wwwchenweimobi);
textAreasetColumns();
textAreasetRows();
scrollPanesetViewportView(textArea);
getContentPane()add(scrollPane javaawtBorderLayoutCENTER);
btnOutsetText(Systemoutprintln(SystemgetProperties()););
btnOutaddActionListener(new javaawteventActionListener() {
public void actionPerformed(javaawteventActionEvent evt) {
btnOutActionPerformed(evt);
}
});
getContentPane()add(btnOut javaawtBorderLayoutPAGE_END);
pack();
}
private void btnOutActionPerformed(javaawteventActionEvent evt) {
Systemoutprintln(SystemgetProperties());
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
javaawtEventQueueinvokeLater(new Runnable() {
public void run() {
new MainFrame()setVisible(true);
}
});
}
private javaxswingJButton btnOut;
private javaxswingJScrollPane scrollPane;
private javaxswingJTextArea textArea;
}