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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Написание swing-компонента, подкиньте хороших линков, пожалуйста 
:(
    Опции темы
Dude03
Дата 24.4.2007, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Собственно сабж. Захотелось реализовать свой компонент... Начал с исходников классов jdk(JLabel, JTextField ну и так далее). Но что-то тяжковато разбиратся - что, куда и зачем. Можете покинуть линков, чтобы легче было(мне) smile 
PM MAIL   Вверх
fixxer
Дата 24.4.2007, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Какого рода компонент? На основе существующих или с кастомной отрисовкой?

В первом случае лучше наследоваться от JPanel, во втором или от JPanel или от JComponent и перекрывать paintComponent(Graphics)


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


Шустрый
*


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

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



Цитата(fixxer @  24.4.2007,  21:17 Найти цитируемый пост)
перекрывать paintComponent(Graphics)

Всю жизнь переопределял paint(Graphics). И вот почему:

Цитата из JavaDoc для paint():
Цитата

This method actually delegates the work of painting to three protected methods: paintComponent, paintBorder, and paintChildren.


Т. е.  если мы полностью хотим самостоятельно рисовать компонент, и должны перекрыть сам paint(). А в твоём случае система рисует ещё и рамку с дитями, что, как правило, для самодельных компонентов излишне. 

Также следует иметь в виду, что передаваемый графический контекс в paintComponent() нельзя изменять:
Цитата

If you override this in a subclass you should not make permanent changes to the passed in Graphics. For example, you should not alter the clip Rectangle or modify the transform. If you need to do these operations you may find it easier to create a new Graphics from the passed in Graphics and manipulate it.

--------------------
"Fais se que dois, - adviegne que peut. C'est commande au chevalier"
PM   Вверх
fixxer
Дата 26.4.2007, 07:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Т. е.  если мы полностью хотим самостоятельно рисовать компонент, и должны перекрыть сам paint(). А в твоём случае система рисует ещё и рамку с дитями, что, как правило, для самодельных компонентов излишне. 


Ну на вкус и цвет все фломастеры разные.

Цитата

If you override this in a subclass you should not make permanent changes to the passed in Graphics. For example, you should not alter the clip Rectangle or modify the transform. If you need to do these operations you may find it easier to create a new Graphics from the passed in Graphics and manipulate it.


А вот это легко обходится.

Код

AffineTransform oldTransform = g2.getTransform();
g2.setTransform(...);
g2.draw(...);
g2.setTransform(oldTransform);


Ну или даже, как и написано g.create(...)

Это сообщение отредактировал(а) fixxer - 26.4.2007, 07:09


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


software saboteur
****


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

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



Переопределения методов paint() и paintComponent() имеют свои особенности, что парой имеет большое значение.
Например метод paint() вызывается после того, как были прорисованы дочерние компоненты, а метод paintComponent - до. Если вы хотите порисовать некий собственный фон для вашего компонента-контейнера, то нужно делать это в методе paintComponent(), тогда все дочерние компоненты окажутся "на фоне". А если, к примеру, вы реализуете функциональность группового  выделения мышью, при котором должен рисоваться прозрачный прямоугольник (тот что показывает область выделения) поверх компонентов, то следует его рисовать в методе paint().


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
RebornCrusader
Дата 27.4.2007, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



"Дико извиняюсь", но...
Цитата(powerOn @  27.4.2007,  03:13 Найти цитируемый пост)
Например метод paint() вызывается после того, как были прорисованы дочерние компоненты, а метод paintComponent - до

Что-то странное. Это откуда информация? Поверхностный просмотр javadocов, исходников и книжки Портянкина (в частности, стр. 113) такого не выявляет. Да, рисуется сам компонент, затем дети - это и так очевидно. Но выглядит это так: 
Цитата

(очень грубая схема)

paint() {
paintComponent()
paintBorder()
paintChildren()
}

Перекрывая paint(), мы убиваем весь этот механизм и рисуем полностью сами.

P.S. super.paint(), конечно, имеет смысл вызывать именно первым (если вообще вызывать).
--------------------
"Fais se que dois, - adviegne que peut. C'est commande au chevalier"
PM   Вверх
powerOn
Дата 27.4.2007, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Главное в каком порядке отрабатывает наш код, а не код супер класса.

Я имел ввиду перекрытие с вызовом метода super.paint() и super.paintComponent(), как вы и сказали, на первом месте. Вообще методы суперкласса полезно вызывать, хотя и никто не заставляет. Но не делая этого, логика работы конечно же будет нарушена.

При таком подходе, бизнес нагрузка переопределенных методов будет срабатывать в несколько ином порядке. Т.е. я имет ввиду порядок, при котором метод полностью отработает. Кстати, ваша схема прекрасно это отображает.
Цитата

paint() {
paintComponent()
// paintComponent() завершился. Значит и наш (переопределенный в потомке) метод paintComponent() завершился - т.е. отработал первым.
paintBorder()
// paintBorder() завершился.
paintChildren()
// paintChildren() завершился.
}
paint() завершился. Отработал последним, хоть и дернули его первым.





--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0450 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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