Графическая библиотека Java для разноцветного текста

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
631
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Не настоящий ответ, но если вы думаете / измеряете, что создание большого количества объектов Color является узким местом производительности, вы можете заменить вызовы нового цвета (rgb) своим собственным фабричным методом, который кэширует уже созданные цвета. (Я предполагаю, что класс Colors неизменен - ​​похоже, что это так)

Поэтому добавьте класс ColorsFactory с методом (статическим) методом getColor (rgb), который кэширует уже созданные цвета. Вы можете просто поместить все цвета на карту rgb -> Color (rgb) и сохранить их навсегда, или вы можете попытаться создать кеш, который удаляет цвета, которые не используются часто (много библиотек для этого) - немного зависит от способ использования вашей программы.

Библиотека используется следующим образом: en.wikipedia.org/wiki/Roguelike

Raymond Martineau 28.12.2008 04:32

Попробуйте часть компонентов ДЖИДЕ с открытым исходным кодом. Сюда входит класс StyledLabel, который представляет собой Swing JLabel, поддерживающий разноцветные шрифты.

Обновление для читателей:

  • Фактическая проблема была вызвана тем, что часто вызываемый метод генерирует исключение времени выполнения и использует это исключение для возврата значения по умолчанию. Я изменил код этого метода, чтобы избежать исключения раньше времени, и если оно все же произойдет, позвольте вызывающей функции (функциям) обработать их.
  • Поскольку значение по умолчанию не так полезно, я добавил код, чтобы пропустить рендеринг большинства этих символов.
Ответ принят как подходящий

Я предполагаю, что вы визуализируете текст в произвольный компонент (через paintComponent ()), а не пытаетесь изменить цвет текста в JTextPane, JLabel или другом уже существующем виджете.

В этом случае вам следует изучить возможность использования AttributedString вместе с TextAttribute. Они позволяют назначать разные стили (цвет, шрифт и т. д.) Различным диапазонам символов в строке, а затем отображать всю строку с помощью Graphics.drawString (...). Таким образом, базовая графическая подсистема будет обрабатывать любые необходимые изменения состояния графики во время рендеринга, делая ваш код более читабельным и, возможно, более быстрым.

Здесь - пример использования.

Конечно, как уже упоминалось, вы также должны кэшировать свои объекты Color, а не воссоздавать их снова и снова.

Другие вопросы по теме