多彩多姿的文本的Java图形库

时间:2008-12-27 23:44:34

标签: java graphics

我想知道在Java中处理多色文本的推荐库或过程。我目前对java.awt.Graphics的使用虽然是函数,但似乎比必要的要复杂一些。

主要问题涉及频繁更改颜色,每当需要新颜色时创建一个新的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类 - 虽然它非常适合像素级图形,但它并不直接支持绘图字符。

4 个答案:

答案 0 :(得分:5)

我假设您将文本渲染到任意组件(通过paintComponent()),而不是尝试修改JTextPane,JLabel或其他预先存在的小部件中的文本颜色。

如果是这种情况,您应该考虑使用AttributedStringTextAttribute。这些允许您为字符串中的各种字符范围分配不同的样式(颜色,字体等),然后使用Graphics.drawString(...)呈现整个字符串。这样,底层图形子系统将在渲染过程中处理对图形状态的任何必要更改,使您的代码更具可读性,并且可能更快。

Here是一个示例用法。

当然,正如其他人所提到的,你也应该缓存你的Color对象,而不是一遍又一遍地重新创建它们。

答案 1 :(得分:1)

不是一个真正的答案,但如果您认为/测量创建大量Color对象是性能瓶颈,您可以通过自己的工厂方法替换对新Color(rgb)的调用,该方法缓存已创建的颜色。 (我假设Colors类是不可变的 - 它看起来像是)

因此,使用(静态)方法getColor(rgb)方法添加ColorsFactory类,该方法缓存已创建的颜色。您可以简单地将所有颜色放在地图中rgb - >颜色(rgb)并保持它们永远存在或者你可以尝试创建缓存来删除不经常使用的颜色(很多库来做) - 取决于程序的使用方式。

答案 2 :(得分:0)

尝试JIDE组件的开源部分。这包括一个名为StyledLabel的类,它是一个支持多色字体的Swing JLabel。

答案 3 :(得分:0)

读者更新:

  • 实际问题是由经常调用的方法抛出运行时异常并使用该异常返回默认值引起的。我改变了这个方法的代码以提前避免异常,如果它仍然发生,让调用函数处理它们。
  • 由于默认值没有用,我添加了代码以跳过渲染大部分字符。