<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    nighty

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

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

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

       最近為一個項目的服務(wù)器的做一個界面的時候,為了能把原來在后臺打印出來的相關(guān)信息重定向到GUI界面的時候,費了一些心思。都是以前在實現(xiàn)的時候大多數(shù)信息的打印和測試時使用的都是System.out和System.err之類,圖個方便,沒有使用log功能。當然這是個不好的習(xí)慣。
       剛開始的時候用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類型的參數(shù),只要在調(diào)用打印信息的前面調(diào)用這二個方法重設(shè)輸出流和錯誤流就可以達到我們的目的。那么我們繼承PrintStream類,并把要顯示信息的組件作為參數(shù)傳入到這個自定義的打印流類中。

     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     * 在這里重截,所有的打印方法都要調(diào)用的方法
    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}

    把組件作為參數(shù)傳入到這個打印流中,并重寫父類的write(byte[] buf, int off, int len)方法,把寫出的信息添加到組件上,注意到重載了帶OutputStream的構(gòu)造方法。
       這里有二點必須注意,確保組件在調(diào)用打印信息添加前是已經(jīng)被正確創(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信息轉(zhuǎn)移到你的GUI界面上。


    剛進場的時候戲就落幕

    Feedback

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

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

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

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

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

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

    /**
    * 在這里重截,所有的打印方法都要調(diào)用的方法
    */
    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ā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲国产精品综合一区在线| 亚洲精品乱码久久久久久| 亚洲网红精品大秀在线观看 | 久久久久亚洲Av片无码v| 一级毛片a女人刺激视频免费| 免费人成年轻人电影| 猫咪免费观看人成网站在线| 亚洲av高清在线观看一区二区| 美女被吸屁股免费网站| 亚洲国产精品成人| 99久久免费国产特黄| 亚洲成a人片在线观看中文动漫 | 亚洲一区二区三区写真 | 亚洲无人区午夜福利码高清完整版| sihu国产精品永久免费| 亚洲级αV无码毛片久久精品| 国产免费一区二区三区不卡 | 亚洲AV成人精品一区二区三区 | 亚洲欧洲自拍拍偷午夜色无码| 无码人妻一区二区三区免费n鬼沢| 亚洲AV人无码综合在线观看| 91免费人成网站在线观看18| 亚洲精品亚洲人成在线| 亚洲精品国产电影| 久久久久久影院久久久久免费精品国产小说 | 亚洲免费在线视频播放| 日本免费一区二区三区最新| 一级特级女人18毛片免费视频| 亚洲av无码国产精品色午夜字幕| 日本三级2019在线观看免费| 亚洲av综合日韩| 亚洲AV无码久久精品色欲| 一个人看www在线高清免费看 | 亚洲黄片毛片在线观看| 久久中文字幕免费视频| 亚洲精品国产国语| 国产AⅤ无码专区亚洲AV| 99久久久国产精品免费无卡顿| 黄色一级免费网站| 亚洲中文无码av永久| 亚洲国产天堂久久久久久|