熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java標准輸出重定向到GUI

2013-11-23 18:51:25  來源: Java核心技術 

  實現輸出從控制台到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;

  }


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25870.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.