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

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

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

    love fish大鵬一曰同風(fēng)起,扶搖直上九萬(wàn)里

    常用鏈接

    統(tǒng)計(jì)

    積分與排名

    friends

    link

    最新評(píng)論

    把控制臺(tái)重定向到GUI組件上(轉(zhuǎn))

    最近為一個(gè)項(xiàng)目的服務(wù)器的做一個(gè)界面的時(shí)候,為了能把原來(lái)在后臺(tái)打印出來(lái)的相關(guān)信息重定向到GUI界面的時(shí)候,費(fèi)了一些心思。都是以前在實(shí)現(xiàn)的時(shí)候大多數(shù)信息的打印和測(cè)試時(shí)使用的都是System.out和System.err之類,圖個(gè)方便,沒有使用log功能。當(dāng)然這是個(gè)不好的習(xí)慣。
       剛開始的時(shí)候用Swing做了一個(gè)面板,采用JTextPane組件作為打印信息的容器??赡苁翘脹]有用Swing了,在測(cè)試的時(shí)候這個(gè)東西的水平滑動(dòng)塊老是隨著信息的顯示自動(dòng)地滑向最后的地方,而且打印信息看起來(lái)很凌亂。后來(lái)就換用SWT,把打印的信息容器換用Text組件,把樣式定義為SWT.MULT | SWT.V_SCROLL | SWT.WRAP ,讓它可以自動(dòng)換行。
       查一下JDK的API文檔,System類提供了可以重定向的方法setOut(PrintStream out)、setErr(PrintStream err)、setIn(InputStream in)。在此我們只需求使用setOut和setErr就夠了,這二個(gè)方法都要傳入一個(gè)PrintStream類型的參數(shù),只要在調(diào)用打印信息的前面調(diào)用這二個(gè)方法重設(shè)輸出流和錯(cuò)誤流就可以達(dá)到我們的目的。那么我們繼承PrintStream類,并把要顯示信息的組件作為參數(shù)傳入到這個(gè)自定義的打印流類中。
     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ù)傳入到這個(gè)打印流中,并重寫父類的write(byte[] buf, int off, int len)方法,把寫出的信息添加到組件上,注意到重載了帶OutputStream的構(gòu)造方法。
       這里有二點(diǎn)必須注意,確保組件在調(diào)用打印信息添加前是已經(jīng)被正確創(chuàng)建的,另外必須注冊(cè)不同GUI組件對(duì)線程的訪問形式,像上面的SWT就對(duì)界面的訪問有嚴(yán)格的規(guī)定。
       完成了PrintStream后,下面是如何使用,在我們啟動(dòng)界面后,使用下面的方式:
    1MyPrintStream mps = new MyPrintStream(System.out, text);
    2        System.setOut(mps);
    3        System.setErr(mps);

    ,這樣就可以把原來(lái)程序里的所有System.out和System.err信息轉(zhuǎn)移到你的GUI界面上。

    posted on 2007-10-31 09:04 liaojiyong 閱讀(923) 評(píng)論(0)  編輯  收藏 所屬分類: Eclipse

    主站蜘蛛池模板: 亚洲高清国产AV拍精品青青草原| 亚洲综合视频在线观看| 日本一道一区二区免费看| 亚洲日本在线播放| 一级做a爰片久久毛片免费陪 | 久久精品国产亚洲5555| 日韩大片在线永久免费观看网站 | 在线播放免费人成视频网站| 久久精品免费观看| 亚洲AV无码之日韩精品| 久久久无码精品亚洲日韩京东传媒| 久久久免费的精品| 亚洲国产美女在线观看| 在线看片无码永久免费视频| 亚洲午夜无码毛片av久久京东热| 午夜无遮挡羞羞漫画免费| 亚洲欧美国产欧美色欲| 四虎影视永久免费观看网址| 一区二区三区免费看| 亚洲成A人片777777| 16女性下面扒开无遮挡免费| 亚洲国产精品成人精品小说| 夫妻免费无码V看片| 日韩在线一区二区三区免费视频 | 好紧我太爽了视频免费国产| 久久久久亚洲精品天堂| 永久免费AV无码国产网站| 在线亚洲v日韩v| 亚洲国产精品国自产拍AV| 国产精彩免费视频| 精品国产亚洲第一区二区三区| 亚洲情a成黄在线观看| 久久伊人免费视频| 亚洲另类无码一区二区三区| 亚洲精品国产成人影院| 免费无码毛片一区二区APP| 亚洲精品无码国产片| 久久99国产亚洲高清观看首页| 在线看片免费人成视久网| 真正全免费视频a毛片| 亚洲国产成人久久精品影视|