Я хотел бы знать рекомендуемую библиотеку или процедуру для работы с разноцветным текстом в 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 - хотя он отлично подходит для графики на уровне пикселей, он напрямую не поддерживает рисование символов.




Не настоящий ответ, но если вы думаете / измеряете, что создание большого количества объектов Color является узким местом производительности, вы можете заменить вызовы нового цвета (rgb) своим собственным фабричным методом, который кэширует уже созданные цвета. (Я предполагаю, что класс Colors неизменен - похоже, что это так)
Поэтому добавьте класс ColorsFactory с методом (статическим) методом getColor (rgb), который кэширует уже созданные цвета. Вы можете просто поместить все цвета на карту rgb -> Color (rgb) и сохранить их навсегда, или вы можете попытаться создать кеш, который удаляет цвета, которые не используются часто (много библиотек для этого) - немного зависит от способ использования вашей программы.
Попробуйте часть компонентов ДЖИДЕ с открытым исходным кодом. Сюда входит класс StyledLabel, который представляет собой Swing JLabel, поддерживающий разноцветные шрифты.
Обновление для читателей:
Я предполагаю, что вы визуализируете текст в произвольный компонент (через paintComponent ()), а не пытаетесь изменить цвет текста в JTextPane, JLabel или другом уже существующем виджете.
В этом случае вам следует изучить возможность использования AttributedString вместе с TextAttribute. Они позволяют назначать разные стили (цвет, шрифт и т. д.) Различным диапазонам символов в строке, а затем отображать всю строку с помощью Graphics.drawString (...). Таким образом, базовая графическая подсистема будет обрабатывать любые необходимые изменения состояния графики во время рендеринга, делая ваш код более читабельным и, возможно, более быстрым.
Здесь - пример использования.
Конечно, как уже упоминалось, вы также должны кэшировать свои объекты Color, а не воссоздавать их снова и снова.
Библиотека используется следующим образом: en.wikipedia.org/wiki/Roguelike