2008-12-27 39 views
1

我想知道推薦用於處理Java中多色文本的庫或過程。我目前使用的java.awt.Graphics,雖然函數,似乎有點複雜,不必要的。用於多色文本的Java圖形庫

主要問題涉及到顏色的頻繁變化,無論何時需要新顏色(並且通常不是預定義值之一),都會創建一個新的java.awt.Colour()對象。使用的RGB值,但它可能是顏色可以潛在地改變,以獨特的價值觀爲每個我畫人物:

java.awt.Color colorRender = new java.awt.Color(rgb); 
g.setColor(colorRender); 

我也跑在我的代碼分析器,並在極端情況下確定了二次瓶頸。我懷疑這可能是用於繪製單個字符的方法,但也有可能在確定上述文字是開銷:

char[] c = new char[1]; // Created once for many uses 
/* ... */ 
g.drawChars(charRender, 0, 1, x, y); 

我已經看過BufferedImage類 - 雖然它的像素級別的圖形是偉大的,它不直接支持繪製字符。

回答

5

我假設你正在渲染文本到任意組件(通過paintComponent()),而不是試圖修改JTextPane,JLabel或其他預先存在的小部件中的文本顏色。

如果是這種情況,您應該使用AttributedString以及TextAttribute。這些允許您爲字符串中的各種字符範圍指定不同的樣式(顏色,字體等),然後使用Graphics.drawString(...)呈現整個字符串。這樣,底層圖形子系統將在渲染過程中處理圖形狀態的任何必要更改,使您的代碼更具可讀性,並且可能更快。

Here是一個示例用法。

當然,正如其他人所提到的,您還應該緩存Color對象而不是一遍又一遍地重新創建它們。

1

不是一個真正的答案,但是如果您認爲/測量創建大量Color對象是性能瓶頸,則可以用自己的工廠方法替換對新顏色(rgb)的調用,以緩存已創建的顏色。 (我假設Colors類是不可變的 - 它看起來像是這樣)

因此,添加一個ColorsFactory類和一個緩存已經創建的顏色的(靜態)方法getColor(rgb)方法。你可以簡單地把所有的顏色放在一個地圖rgb - > Color(RGB)中並且永久保存它們,或者你可以嘗試創建緩存來去除不經常使用的顏色(很多庫都是這樣做的) - 取決於你的程序被使用的方式。

+0

http://en.wikipedia.org/wiki/Flyweight_pattern – 2008-12-28 00:20:22

0

試試JIDE組件的開源部分。這包括一個名爲StyledLabel的類,它是支持多色字體的Swing JLabel。

0

更新爲讀者:

  • 實際的問題是由一個經常調用的方法拋出一個運行時異常,並使用該異常返回默認值造成的。我改變了這個方法的代碼以提前避免異常,如果它仍然存在,讓調用函數處理它們。
  • 由於默認值沒有那麼有用,我添加了代碼以跳過大部分這些字符的渲染。