把控制臺(tái)重定向到GUI組件上(轉(zhuǎn))
最近為一個(gè)項(xiàng)目的服務(wù)器的做一個(gè)界面的時(shí)候,為了能把原來在后臺(tái)打印出來的相關(guān)信息重定向到GUI界面的時(shí)候,費(fèi)了一些心思。都是以前在實(shí)現(xiàn)的時(shí)候大多數(shù)信息的打印和測試時(shí)使用的都是System.out和System.err之類,圖個(gè)方便
剛開始的時(shí)候用Swing做了一個(gè)面板,采用JTextPane組件作為打印信息的容器。可能是太久沒有用Swing了,在測試的時(shí)候這個(gè)東西的水平滑動(dòng)塊老是隨著信息的顯示自動(dòng)地滑向最后的地方,而且打印信息看起來很凌亂。后來就換用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è)自定義的打印流類中。
1
public 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
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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)界面后,使用下面的方式:
1
MyPrintStream mps = new MyPrintStream(System.out, text);
2
System.setOut(mps);
3
System.setErr(mps);

2

3

,這樣就可以把原來程序里的所有System.out和System.err信息轉(zhuǎn)移到你的GUI界面上。
posted on 2007-10-31 09:04 liaojiyong 閱讀(922) 評(píng)論(0) 編輯 收藏 所屬分類: Eclipse