把控制台重定向到GUI元件上

2021-08-30 03:52:00 字數 1189 閱讀 9002

最近為乙個專案的伺服器的做乙個介面的時候,為了能把原來在後台列印出來的相關資訊重定向到gui介面的時候,費了一些心思。都是以前在實現的時候大多數資訊的列印和測試時使用的都是system.out和system.err之類,圖個方便

剛 開始的時候用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類,並把要顯示資訊的元件作為引數傳入到這個自定義的列印流類 中。

1class

myprintstream 

extends

printstream  9

10/** */

/**11

* 在這裡重截,所有的列印方法都要呼叫的方法

1213

public

void

write(

byte

buf, 

intoff, 

intlen)  22

);23

2425

把元件作為引數傳入到這個列印流中,並重寫父類的write(byte buf, int off, int len)方法,把寫出的資訊新增到元件上,注意到過載了帶outputstream的構造方法。

這裡有二點必須注意,確保元件在呼叫列印資訊新增前是已經被正確建立的,另外必須註冊不同gui元件對執行緒的訪問形式,像上面的swt就對介面的訪問有嚴格的規定。

完成了printstream後,下面是如何使用,在我們啟動介面後,使用下面的方式:

1=new

myprintstream(system.out, text);23

,這樣就可以把原來程式裡的所有system.out和system.err資訊轉移到你的gui介面上。

控制台輸出重定向到Memo

函式runcmd void fastcall tform1 runcmd ansistring cmdline,tstrings result else createpipe hreadpipe,hwritepipe,null,1024 screen cursor crhourglass try d...

控制台重定向stdout stderr

通常,乙個控制台 命令提示符 應用程式或命令的輸出將傳送到兩個單獨的流.常規的輸出傳送到標準出 stdout 並將錯誤訊息傳送到標準錯誤 stderr 當你重定向控制台輸出使用 符號,只重定向標準輸出.要重定向stderr,必須指定 2 的重定向符號.這將選擇第二個輸出流stderr。kill hu...

控制台輸入輸出重定向

一般來講gui程式不能使用stdin和stdout,但是有時有些特殊需要,希望gui程式也有控制台,如 乙個程式,既可以以gui方式執行,又可以如果使用者在控制台裡打程式名的話,就以控制台程式的方式執行。通過allocconsole 和 attachconsole 這兩個win api就能實現上面的...