Swing實現Java代碼編輯器 - 語法高亮顯示

當JEditorPane被創(chuàng)建時,它會把createDefaultEditorKit()方法(javax.swing.text.EditorKit的子類對象)的返回值作為默認的編輯器工具包,然后將文本的編輯與顯示工作交給這個工具包。其原型為:

2

3

4

EditorKit基本上什么也沒有做,只是提供了很多抽象方法給它的子類去實現,Swing默認已經給它添加了一個子類DefaultEditorKit(Swing常用的一招,就是給抽象類前面加個Default進行最基本的實現),既然是Default,那它所提供的功能肯定和一個記事本沒有多大區(qū)別,這要是繼承下來,有多少方法需要覆蓋啊,別慌,查看一下Swing的源碼,你會發(fā)現Swing還提供了一個繼承自DefaultEditorKit的類StyledEditorKit,顧名思義,這個類肯定為我們提供了很多支持格式化顯示的方法,又是一個巨人,快,趕緊拉過來往肩上爬。
接下來就是覆蓋StyledEditorKit中的相關方法了,其實有很多方法都可以覆蓋,但是意義不是很大,比如
EditorKit中有兩個重要的方法實現對文檔的管理與顯示:
創(chuàng)建一個適合此編輯器類型文本存儲模型。EditorKit把對文本文檔的管理功能交給了這個方法的返回值。
獲取適合生成此工具包生成的任何模型視圖的工廠。EditorKit把編輯器的顯示功能交給了這個方法的返回值,比如什么字符顯示成什么樣子,什么顏色等。我們必須覆蓋這兩個方法以實現自定義編輯器的功能。
因為我們的編輯器和JEditorPane唯一不同的可能就是代碼怎么來顯示,所以createDefaultDocument()可以返回一個默認的javax.swing.text.DefaultStyledDocument 就行,對于getViewFactory,我們需要定制一個ViewFactory視圖來實現編輯器獨有的各種顯示功能。
ViewFactory在Java中被定義為一個接口,里面提供了唯一的一個方法:
這個方法根據給定的文檔的結構化元素創(chuàng)建一個視圖。在這個方法中,我們只需要返回一個繼承自View的視圖即可,真正的顯示任務是交給這個視圖的。因此,我們的ViewFactory類很簡單:

2

3

4

5

6

7

8

9

10

11

12

接下來的重點就是這個JavaEditorView了,所有的語法高亮等顯示功能都是交給它來完成的
View是一個抽象類,Swing默認給我們提供了多個它的子類,AsyncBoxView, ComponentView, CompositeView, GlyphView, IconView, ImageView, PlainView 以實現對不同文檔類型的顯示,當中只有PlainView是與文本文檔相關的,它實現簡單的多行文本視圖的 View 接口,該文本視圖的文本只有一種字體和顏色,沒錯,我們的JavaEditorView需要繼承自PlainView。
PlainView提供了很多方法進行文本文檔的視圖顯示,要實現高亮顯示,我們關心的有兩個方法:
一看名字就知道這個方法是控制選中狀態(tài)下的顯示方式,由于本文只討論非選中狀態(tài)。所以重點看一下另外一個方法:
這個方法將模型中給定的范圍呈現為正常的未選定文本。使用前景色或指定的顏色顯示文本。
參數:
g - 圖形上下文(做Swing的人再熟悉不過了,文本也是畫出來的)
x - 起始 X 坐標,該值 >= 0
y - 起始 Y 坐標,該值 >= 0
p0 - 模型中的起始位置,該值 >= 0
p1 - 模型中的結束位置,該值 >= 0
下面是覆蓋后的實現:

2

3

4

5

6

7

8

先是得到從起始位置到結束位置的長度,然后再交由scanParagraph去處理指定長度的文本,其實也就是怎么把它畫出來。
對于一個Java代碼編輯器,要考慮類名,運算符,數字,關鍵字等的顯示方式,所以scanParagraph要做的事情很多,本文只以怎么么高亮顯示類名為例來說明:

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26



27

28

29

30



31

我只是以類名進行示范,實際中可能還要考慮此類名是否在注釋當中等等...
posted on 2010-02-10 14:27 凱子 閱讀(3134) 評論(9) 編輯 收藏 所屬分類: Swing