![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| carper |
|
|||
|
Unregistered |
Создаю свой UI для метки (в данном конкретном случае просто нужен объемный текст).
Проблема - форма (JFrame и т.п.), содержащая хотя бы одну такую самопальную метку, нормально перерисовывется ТОЛЬКО при изменении размера. Если же, например, мы просто перекроем такое окошко окном другой программы, то, когда мы закроем эту др. программу, вновь появившееся окно будет содержать нормально отрисованную нашу самопальную метку!, а все остальные GUI компоненты "пропадут" (впредь до следующего изменения размера окна). Т.е. такое впечатление, что эта моя самопальная метка должна как-то взаимодействовать с остальными компонентами, отслеживая invalidate и вызывая repaint для всех остальных компонентов - легко сказать, но непонятно почему это происходит и как сделать. Ни в одном из примеров на SUN ничего подобного нет, точнее все примеры вроде бы говорят, что я все делаю правильно и заморачиваться с redraw "чужих" компонентов я не должен. Ниже пример кода:
|
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 10 Всего: 118 |
А как это можно собрать
3DTransform - такое имя разве возможно ? Добавлено @ 19:21 Кроме того, надо посмотреть - отвечает ли у тебя твоя метка за прорисовку своего фона. Если отвечает, то вообщем-то она действительно сама должна просить прорисоваться всем компонентам. Может она у тебя занимает всю область ? Текст проверить никак - ибо не мал (лениво немного |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 38 Всего: 538 |
Я не понял, пока в чем дело но этот код у меня дает 100% загрузку процессора.
Правда есть один момент, не знаю имеет ли он отношение к делу:
-------------------- 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. |
|||
|
||||
| carper |
|
|||
|
Unregistered |
AntonSaburov
Прошу прощения - не 3DTransformUI, было test3DTransformUI - при задании вопроса я попытался сократить имя до удобочитаемого и слегка промахнулся. LSD Нет 100% загрузки у меня нет, зато есть 50%, что тоже очень много!!! Боюсь, что проблемы с перерисовкой остальных компонентов и подозрительная загрузка процессора одного поля ягоды, я заметил это только после Вашего сообщения. (JAVA 1.5) AffineTransform aft = AffineTransform.getRotateInstance(-(0*3.14)/180); - Это пустышка, оставленная из-за того, что меня не удовлетворяет получаемая тень (слишком четкая) и я пытаюсь экспериментировать с кодом -отсюда и умножение на 0. (умножение на реальное число никакого улучшения ситуации не дает). AntonSaburov "Кроме того, надо посмотреть - отвечает ли у тебя твоя метка за прорисовку своего фона. " Я привел полный код, того, что она делает. "Если отвечает, то вообщем-то она действительно сама должна просить прорисоваться всем компонентам." Каким образом она должна это сделать и почему? "Может она у тебя занимает всю область ?" Да вроде как нет. По крайней мере в своем коде я вроде как не могу найти места, где она бы пыталсь расползтись на всю область. Я пробовал размещать другие компоненты на различных панелях и использовать различные Layout Managers - эффект абсолютно то же - наличие такой метки загадочно отдает команду всем остальным (СТАНДАРТНЫМ) компонентам отрисовываться только при ресайзе. А сама моя кривая метка радостно демонстрирует абсолютно правильную перерисовку во всех остальных случаях. Попробуйте добавить в main такой код : JLabel mll= new JLabel("ЧТОТОЕЩЕ"); mll.setForeground(Color.BLUE); mll.setFont(new Font("Arial", Font.PLAIN, 72)); contentPane.add(mll); И посмотрите как себя поведет эта вторая метка. P.S. В общем-то очевидно, что проблема именно в моем коде, это никак на баг JAVA, но что-то я запутался совсем. |
|||
|
||||
| carper |
|
|||
|
Unregistered |
Вроде бы проблема в строчке
DrawTxt(clippedText, new Color(209,209,209), label, g, textX, textY, ShadowWidth, ShadowWidth, label.isEnabled()); Точнее в последующем затем вызове label.setForeground(newColor); - Именно здесь и возникают проблемы, если цвет отличается от первоначального. Т.е. понятно, что назначив новый цвет я принимаю на себя какие-то доп. обязательства вот только не ясно какие. Кажется именно про это говорил AntonSaburov, но что с этим деалать на практике я не понимаю. |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 38 Всего: 538 |
Я понял в чем причина 100% загрузки проца:
Вы меняете цвет компонента во время его перерисовки, что вызывает его перересовку, отсюда и бесконечный цикл. -------------------- 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. |
|||
|
||||
| carper |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 2.3.2005 Репутация: 4 Всего: 8 |
LSD
Да, спасибо большое. Именно так все и происходило. Теперь закономерно возникает вопрос (поскольку я все еще надеюсь, что мне удастся сделать трехмерной именно JLabel) как можно поменять цвет? Ведь в случае метки я не могу работать напрямую с кистями? |
|||
|
||||
| carper |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 2.3.2005 Репутация: 4 Всего: 8 |
Что-то ступил, никто же мне не мешает использовать:
g.setColor(...); BasicGraphicsUtils.drawString(g,clippedText,32, textX,textY); Вопрос теперь в другом, что-то у меня теперь все хорошо с загрузкой процессора и цветами, да вот только теперь имею обратную картину Непонятно - я же не перекрывал стандартный actionListener для BasicLabelUI, чего же это он не вызывает мой paint на invalidate? |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 38 Всего: 538 |
Косяк здесь:
Если DrawTxt закоментарить, то все будет нормально перерисовываться. -------------------- 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. |
|||
|
||||
| carper |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 2.3.2005 Репутация: 4 Всего: 8 |
LSD
"Если DrawTxt закоментарить, то все будет нормально перерисовываться. " Если его закомментировать, то нечему будет нормально перерисовываться. Сейчас исправленный текст этой функции выглядит так:
Все работает - процессор не грузит, при сворачивании-разворачивании, изменении размеров или при перекрытии другим окошком ВСЕ нормально работает. Единственный косяк в ToolTips - после всплывающей подсказки на фоне моей метки прерисовка не происходит, точнее лезут артифакты. На сайте SUN нашел маловразумительную подсказку, что если использовать AffineTransform и/или opaque в paint(), то возможны артефакты, а вот как с этим бороться не понял. |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 10 Всего: 118 |
Сильно подозреваю, что в таком случае единого решения может и не найдется. Придется копаться и "бить в бубен". Если решение найдется - будем крайне признательны, если поделишься. Удачи. |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 38 Всего: 538 |
Надо закоментарить только тот что я выделил, и тогда остальные 3 будут нормально перерисовываться. Вот что у меня получилось, все нормально перерисовывается, включая ToolTips Добавлено @ 21:17 Я думаю проблема в одном из AffineTransform. Присоединённый файл ( Кол-во скачиваний: 2 )
Label3D.zip-------------------- 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. |
|||
|
||||
| carper |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 2.3.2005 Репутация: 4 Всего: 8 |
LSD
Н-да, во-первых, если я правильно понял, в первом варианте перерисовка происходила не из-за setForegraundColor, а из-за affineTransform (ну, или из-за сочетания того и другого) ? Мои дальнейшие эксперименты , см. мой пост выше, показали, что избежать зацикливания из-за affineTransform все же можно, но тогда попадаем на проблему с ToolTips. Или же можно избавиться вообще от affineTransform и использовать Ваш вариант, тогда получим тень, но кривоватую - собственно все мои affineTransform именно и возникли из-за желания нарисовать нечто хоть чуть более правдоподобное, чем просто серая буква смещенная на n пискселей. С ToolTips я уперся в проблему того, что я просто не понимаю, из-за чего тут-то возникает проблема? Ну, понятно, что для ускорения перерисовывается скорее всего область, перекрываемая ToolTips, таким образом, методу paint может быть дана команда на перисовку не всей обасти, а только части, что и приводит к косяку. Остается найти в моем коде место, где учитывается динамически изменяемая область рисования. Я пока найти так и не смог.
|
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |