最近為乙個專案的伺服器的做乙個介面的時候,為了能把原來在後台列印出來的相關資訊重定向到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就能實現上面的...