Java графическая библиотека для разноцветного текста - PullRequest
1 голос
/ 28 декабря 2008

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

5 голосов
/ 28 декабря 2008

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

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

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

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

1 голос
/ 28 декабря 2008

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

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

0 голосов
/ 28 декабря 2008

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

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

Попробуйте часть с открытым исходным кодом компонентов JIDE . Это включает в себя класс под названием StyledLabel, который является Swing JLabel и поддерживает многоцветные шрифты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...