nighty

          折騰的年華
          posts - 37, comments - 143, trackbacks - 0, articles - 0

          導航

          <2007年8月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿(7)

          隨筆分類

          隨筆檔案

          文章分類

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          把控制臺重定向到GUI組件上

          Posted on 2007-08-27 19:07 寒武紀 閱讀(1486) 評論(2)  編輯  收藏

             最近為一個項目的服務器的做一個界面的時候,為了能把原來在后臺打印出來的相關信息重定向到GUI界面的時候,費了一些心思。都是以前在實現的時候大多數信息的打印和測試時使用的都是System.out和System.err之類,圖個方便,沒有使用log功能。當然這是個不好的習慣。
             剛開始的時候用Swing做了一個面板,采用JTextPane組件作為打印信息的容器。可能是太久沒有用Swing了,在測試的時候這個東西的水平滑動塊老是隨著信息的顯示自動地滑向最后的地方,而且打印信息看起來很凌亂。后來就換用SWT,把打印的信息容器換用Text組件,把樣式定義為SWT.MULT | SWT.V_SCROLL | SWT.WRAP ,讓它可以自動換行。
             查一下JDK的API文檔,System類提供了可以重定向的方法setOut(PrintStream out)、setErr(PrintStream err)、setIn(InputStream in)。在此我們只需求使用setOut和setErr就夠了,這二個方法都要傳入一個PrintStream類型的參數,只要在調用打印信息的前面調用這二個方法重設輸出流和錯誤流就可以達到我們的目的。那么我們繼承PrintStream類,并把要顯示信息的組件作為參數傳入到這個自定義的打印流類中。

           1public class MyPrintStream extends PrintStream {
           2
           3    private Text text;
           4    
           5    public MyPrintStream(OutputStream out, Text text) {
           6        super(out);
           7        this.text = text;
           8    }

           9
          10    /**
          11     * 在這里重截,所有的打印方法都要調用的方法
          12     */

          13    public void write(byte[] buf, int off, int len) {
          14        final String message = new String(buf, off, len);
          15        
          16        /* SWT非界面線程訪問組件的方式 */
          17        Display.getDefault().syncExec(new Thread(){
          18            public void run(){
          19                /* 在這里把信息添加到組件中 */
          20                text.append(message);
          21            }

          22        }
          );
          23    }

          24    
          25}

          把組件作為參數傳入到這個打印流中,并重寫父類的write(byte[] buf, int off, int len)方法,把寫出的信息添加到組件上,注意到重載了帶OutputStream的構造方法。
             這里有二點必須注意,確保組件在調用打印信息添加前是已經被正確創(chuàng)建的,另外必須注冊不同GUI組件對線程的訪問形式,像上面的SWT就對界面的訪問有嚴格的規(guī)定。
             完成了PrintStream后,下面是如何使用,在我們啟動界面后,使用下面的方式:
          1MyPrintStream mps = new MyPrintStream(System.out, text);
          2        System.setOut(mps);
          3        System.setErr(mps);

          ,這樣就可以把原來程序里的所有System.out和System.err信息轉移到你的GUI界面上。


          剛進場的時候戲就落幕

          Feedback

          # re: 把控制臺重定向到GUI組件上  回復  更多評論   

          2007-08-28 00:20 by 姜利陽
          不錯!

          # re: 把控制臺重定向到GUI組件上  回復  更多評論   

          2007-08-30 12:45 by JAVA面試題
          不錯

          # re: 把控制臺重定向到GUI組件上[未登錄]  回復  更多評論   

          2009-08-06 17:10 by cai
          加個判斷:

          /**
          * 在這里重截,所有的打印方法都要調用的方法
          */
          public void write(byte[] buf, int off, int len) {
          final String message = new String(buf, off, len);
          if(text != null && !text.isDisposed()){
          /**//* SWT非界面線程訪問組件的方式 */
          Display.getDefault().syncExec(new Thread(){
          public void run(){
          /**//* 在這里把信息添加到組件中 */
          text.append(message);
          }
          });
          }else{
          super.write(buf, off, len);
          }
          }

          只有注冊用戶登錄后才能發(fā)表評論。


          網站導航:
           
          主站蜘蛛池模板: 巴里| 滨海县| 鄂尔多斯市| 陆川县| 正镶白旗| 于田县| 绿春县| 漾濞| 定日县| 繁昌县| 旬邑县| 广平县| 江西省| 公安县| 渭南市| 蓬溪县| 吉木乃县| 应用必备| 绥棱县| 页游| 宝坻区| 屏东县| 长顺县| 九江县| 南靖县| 山西省| 平利县| 南康市| 洛南县| 济源市| 乌兰县| 安阳市| 柏乡县| 蚌埠市| 纳雍县| 清徐县| 新昌县| 张家界市| 称多县| 宝坻区| 盐山县|