Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> "Необычное" рисование текста в Graphics 
:(
    Опции темы
Vovo4ka
Дата 26.5.2007, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 25.5.2007

Репутация: нет
Всего: нет



Столкнулся с проблемкой отображения текста с помощью Graphics. 
Нужно сделать что-то похожее на работу над текстом в Фотошопе. Текст должен быть объектом, предназначенным исключительно для графического использования (как, например, Rectangle, Oval и тп) и иметь следующие свойства:
1. масштабируемость;
2. способность поворачиваться - rotate;
3. способность перемещаться;
4. должен уметь считать свою площадь, периметр;
6. должен сохранять все изменения, произошедшие с ним так, чтобы после загрузки из файла возвращаться в свое последнее состояние;

Я вижу 2 способа реализации. Писать String скажем в BufferedImage и с ним уже производить вышеописанные действия, что особого труда не составляет. Но в этом случае возникает проблема с определением точных размеров (длина и ширина всего текста или хотя бы отдельного символа) и с ужасным отображением при масштабировании. И второй способ, совсем уж бредовый, создавать для каждого символа объект, собранный из примитивов. 
А вот самого простого и правильного способа я как всегда не вижу :(

Может кто-то сталкивался с такой задачкой?
PM MAIL   Вверх
fixxer
Дата 26.5.2007, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 15
Всего: 27



Проассоциируйте со своим текстом объекты классов AffineTransform и FontMetrics. (насчет FontMetrics не уверен, читайте javadoc)

Это сообщение отредактировал(а) fixxer - 26.5.2007, 23:14


--------------------
user posted image
PM MAIL ICQ   Вверх
LSD
Дата 27.5.2007, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Создаешь свой визуальный компонент, получаешь у него Graphics2D:
Код
    Font font = new Font("monospaced", Font.PLAIN, 72);
FontRenderContext renderContext = g2.getFontRenderContext();
GlyphVector glyphVector = font.createGlyphVector(renderContext, "ABC");
Shape shape = glyphVector.getOutline(50, 50);

ты получил Shape всей надписи (при желании можно получить побуквенно). Теперь можешь к этому шейпу применять любые трансформации.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Vovo4ka
Дата 27.5.2007, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 25.5.2007

Репутация: нет
Всего: нет



Ребята, спасибо, но это немного не то, что мне нужно. 
Вот смотрите. К примеру у меня есть объект Rectangle, конструктор которого создает 4 точки  - вершины прямоугольника. В методе paintComponent он рисуется через drawPolygon (а не drawRect!) с помощью массива из иксов и игреков его точек. Это позволяет хранить точные координаты всех элементов объекта. То есть, когда нужно например повернуть такой прямоугольник, то делается это в методе самого класса Rectangle (матрица поворота вектора для каждой точки) и там же сохраняются новые координаты всех точек. То же самое надо сделать и для текста.

AffineTransform гораздо удобнее, конечно, но нужно вот именно то, что я описал. Задание такое . Домашнее  smile

FontRenderContext и FontMetrics, если я правильно понял, нельзя получить без Graphics. А во время создания объекта Текст, Graphics и близко не будет. К тому же, они, как и GlyphVector, если опять же понял правильно, зависит от настроек конкретной ОС (dpi, еще что-нибудь) и на разных ОС отображаться будет соответственно по разному... (или нет???)
PM MAIL   Вверх
LSD
Дата 1.6.2007, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



1. рендеринг шрифтов сильно зависит от устройства, поэтому просто так GlyphVector не получить. А Graphics можно получить и от невидимого фрейма.

2. можно использовать:
Код
AffineTransform affineTransform = AffineTransform.getRotateInstance(Math.PI / 6);
PathIterator pathIterator = shape.getPathIterator(affineTransform);
double[] data = new double[6];
while(!pathIterator.isDone())
{
  int type = pathIterator.currentSegment(data);
  switch(type)
  {
    case PathIterator.SEG_LINETO:
      ...
  }
  pathIterator.next();
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.1051 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.