| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: GUI и Java FX приложения > Написание swing-компонента |
| Автор: Dude03 24.4.2007, 12:42 |
| Собственно сабж. Захотелось реализовать свой компонент... Начал с исходников классов jdk(JLabel, JTextField ну и так далее). Но что-то тяжковато разбиратся - что, куда и зачем. Можете покинуть линков, чтобы легче было(мне) |
| Автор: fixxer 24.4.2007, 13:17 |
| Какого рода компонент? На основе существующих или с кастомной отрисовкой? В первом случае лучше наследоваться от JPanel, во втором или от JPanel или от JComponent и перекрывать paintComponent(Graphics) |
| Автор: RebornCrusader 26.4.2007, 04:00 | ||||
Всю жизнь переопределял paint(Graphics). И вот почему: Цитата из JavaDoc для paint():
Т. е. если мы полностью хотим самостоятельно рисовать компонент, и должны перекрыть сам paint(). А в твоём случае система рисует ещё и рамку с дитями, что, как правило, для самодельных компонентов излишне. Также следует иметь в виду, что передаваемый графический контекс в paintComponent() нельзя изменять:
|
| Автор: fixxer 26.4.2007, 07:08 | ||||||
Ну на вкус и цвет все фломастеры разные.
А вот это легко обходится.
Ну или даже, как и написано g.create(...) |
| Автор: powerOn 26.4.2007, 19:13 |
| Переопределения методов paint() и paintComponent() имеют свои особенности, что парой имеет большое значение. Например метод paint() вызывается после того, как были прорисованы дочерние компоненты, а метод paintComponent - до. Если вы хотите порисовать некий собственный фон для вашего компонента-контейнера, то нужно делать это в методе paintComponent(), тогда все дочерние компоненты окажутся "на фоне". А если, к примеру, вы реализуете функциональность группового выделения мышью, при котором должен рисоваться прозрачный прямоугольник (тот что показывает область выделения) поверх компонентов, то следует его рисовать в методе paint(). |
| Автор: powerOn 27.4.2007, 17:01 | ||
| Главное в каком порядке отрабатывает наш код, а не код супер класса. Я имел ввиду перекрытие с вызовом метода super.paint() и super.paintComponent(), как вы и сказали, на первом месте. Вообще методы суперкласса полезно вызывать, хотя и никто не заставляет. Но не делая этого, логика работы конечно же будет нарушена. При таком подходе, бизнес нагрузка переопределенных методов будет срабатывать в несколько ином порядке. Т.е. я имет ввиду порядок, при котором метод полностью отработает. Кстати, ваша схема прекрасно это отображает.
|