|
|
|
Не могу понять механизм наследования
|
|||
|---|---|---|---|
|
#18+
Читаю хорстмана ну и пытаюсь примеры рассмотреть вот код из примера работы с заливками фигур внутри фрейма Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. вобщем у хорстмана написано что вызвав метод предка класса FillPanel setBackground() можно поменять цвет фона контейнера в котором и выводятся эти фигуры т.е. в методе public void paintComponent(Graphics g) если сначала обратиться super.paintComponent(g) то потом не вопрос можно вызвать setBackground(цвет) мне непонятно почему нельзя вызвать сразу setBackground(цвет) без вызова перед этим super.paintComponent(g) ? ведь setBackground должен наследоваться аж от Component (я по иерархии прошел и там хоть переопределеятеся метод в части классов но смысл тот же - передается параметр g в метод setBackground части из них только выше через super) только в классе Component что-то с этим g происходит... ну так мой класс FillPanel наследуется таки от этого самого Component и по цепочке иерархии нигде по самой логике обработки внутри метода не переопределятся но почему я не могу вызвать сразу setBackground без вызова предварительно super.paintComponent(g) я не понял... почему ? :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2012, 16:01:20 |
|
||
|
Не могу понять механизм наследования
|
|||
|---|---|---|---|
|
#18+
Это не фича наследования, это фича того - как Swing работает(EDT) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2012, 16:12:14 |
|
||
|
Не могу понять механизм наследования
|
|||
|---|---|---|---|
|
#18+
А можно конкретно ткнуть где в книге про setBackground написано? По-моему вызывать метод setBackground из paintComponent как-то глупо. setBackground() меняет состояние компаненты. paintComponent() отоброжает текущее состояние компаненты на graphics. менять состояние во время отрисовки как-то глупо. К тому же это будет сильно тормозить на GUI, так как setBackground вызывает repaint() и оповещает всех propertyChangeLister-ов. Такое делают, а потом жалуются что Swing тормозит. Механизмы наследования в Java тут как бы вообще не при чем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2012, 16:16:47 |
|
||
|
Не могу понять механизм наследования
|
|||
|---|---|---|---|
|
#18+
забыл никЭто не фича наследования, это фича того - как Swing работает(EDT) ну вот с подобным выводом вчера я и лег спать А можно конкретно ткнуть где в книге про setBackground написано? 7 издание русское, стр 332 первый том т.е. применяю там super.paintComponent(g); setBackground(Color.PINK); и закраска идет... т.е. пока я не вызову не переопределённый в FillPanel метод суперкласса (всё никак к этому термину не могу привыкнуть... лучше родительского имхо) JPanel который paintComponent() передав туда компонент текущий который g работать не будет :( ну иногда ну никак не могу такое дао постичь paintComponent() отоброжает текущее состояние компаненты на graphics. менять состояние во время отрисовки как-то глупо. ну а как тогда сделать лучше ? если надо поменять цвет после действий пользователя или как реакцию на что-то ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2012, 17:34:40 |
|
||
|
Не могу понять механизм наследования
|
|||
|---|---|---|---|
|
#18+
Last1Cmen7 издание русское, стр 332 первый том Там ничего не написано про то что setBackground() надо вызывать из paintComponent() В этом ваша ключевая ошибка. Last1Cmensuper.paintComponent(g); setBackground(Color.PINK); Так не нужно делать. Last1Cmenи закраска идет... потому что setBackground вызывает внутри repaint, который позже снова вызовет ваш paint, из которго вызовет super.paint, который наконец отрисует задвный вами фон. Это очень не адекватная цепочка. Last1Cmenт.е. пока я не вызову не переопределённый в FillPanel метод суперкласса (всё никак к этому термину не могу привыкнуть... лучше родительского имхо) JPanel который paintComponent() передав туда компонент текущий который g работать не будет :( Вы исследуете какие-то побочные эффекты. setBackground() не нужно вызывать внутри paintComponent(). Перечитайте ещё раз то что я написал выше про состояния. Попытайтесь понять. Last1Cmenну а как тогда сделать лучше ? если надо поменять цвет после действий пользователя или как реакцию на что-то Когда пользователь что-то делает, вызывается соответствующй listener. В нём вы вызываете setBackground(), чтобы поменять цвет. Этот метод вызывает внутри repaint(), чтобы сообщить компаненте, что ей стоит как можно скорее перерисовать себя. Потом вызовется метод paintComponent(), который и отрисует компаненту. Вы его для чего переопределили? Какуюто новую отрисовку добавляете? Не делайте в этом методе никаких вычислений. Это должен быть очень быстрый метод. Он просто берет текуще состояние свойств компаненты и отображает их. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2012, 17:43:37 |
|
||
|
Не могу понять механизм наследования
|
|||
|---|---|---|---|
|
#18+
ммм... хорошо, я понял что так лучше не делать т.к. произойдет повторый вызов перерисовки (что понятное дело не есть гуд) тот же хорстман говорит что paintComponent() вызывать для перерисовки некорректно и лучше использовать repaint() т.е. для первого вызова мне таки надо вызвать paintComponent() так вот где тогда определять цвет фона чтобы избежать повторного вызова ? где-то ещё до стека ? FillPanel panel = new FillPanel(); Container contentPane = getContentPane(); contentPane.add(panel); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2012, 17:58:25 |
|
||
|
Не могу понять механизм наследования
|
|||
|---|---|---|---|
|
#18+
Last1Cmenммм... хорошо, я понял что так лучше не делать т.к. произойдет повторый вызов перерисовки (что понятное дело не есть гуд) Если бы вы не поленились и заглянули в JavaDoc, то нашли бы там упоминание о вот этой статье: http://java.sun.com/products/jfc/tsc/articles/painting/index.html Last1Cmenтот же хорстман говорит что paintComponent() вызывать для перерисовки некорректно и лучше использовать repaint() По-моему у вас опять вольные трактовки. paintComponent() вообще нельзя вызывать. Его вызывает менеджер отрисовки (RepaintManager). В то время как repaint это команда для менеджера отрисовки. Её нужно вызывать, если изменилось состояние, влияющее на отрисовку. Стоит обратить внимание, что такие методы как setBackground() вызывают repaint() самостоятельно. Last1Cmenт.е. для первого вызова мне таки надо вызвать paintComponent() Нет, не нужно. Last1Cmenтак вот где тогда определять цвет фона чтобы избежать повторного вызова ? В методе в котором вы конструируетe GUI, либо обновляете его состояние по какому-либо событию. Last1Cmenгде-то ещё до стека ? FillPanel panel = new FillPanel(); Container contentPane = getContentPane(); contentPane.add(panel); Это не стек. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2012, 18:13:59 |
|
||
|
Не могу понять механизм наследования
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЕсли бы вы не поленились и заглянули в JavaDoc, то нашли бы там упоминание о вот этой статье: http://java.sun.com/products/jfc/tsc/articles/painting/index.html мда... без интернета дома никак вижу :) а так толку мне о таком онлайн напоминании статьи в локальном джавадоке непонято зачем вообще тогда упоминать о setBackground если по книге контекст в котором его следует применять ещё на рассматривался :) ладно спасибо в любом случае пойду переваривать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2012, 18:44:07 |
|
||
|
Не могу понять механизм наследования
|
|||
|---|---|---|---|
|
#18+
Чтобы не создавать новую тему, запостю тут... Есть код, который считается правильный а может и нет. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. Зачем оставлен в NormalCat дефолтный конструктор, т.к. с ним и без него работает правильно? Ведь если дефолного нет, то он создастся автоматически, если такой понадобится. Причем в нем еще вызывается суперконструктор, который является тоже дефолтным для NakedCat (т.к. в нем ничего нет). Код: java 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 02:56:38 |
|
||
|
Не могу понять механизм наследования
|
|||
|---|---|---|---|
|
#18+
В данном случае дефолтный конструктор NormalCat() не вызывается, и для работы примера он не нужен, так как есть явное обращение к коструктору с сигнатурой NormalCat(String name). Скорее всего, его сюда добавили чтобы запутать экзаменуемого; Утверждение, что дефолтный конструктор создается автоматически - неверное, он создается автоматически только если не указано ни одного конструктора; Вызов super(); в конструкторе NormalCat() можно опустить - компилятор вставит его за вас ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 10:28:57 |
|
||
|
Не могу понять механизм наследования
|
|||
|---|---|---|---|
|
#18+
rema174Зачем оставлен в NormalCat дефолтный конструктор, т.к. с ним и без него работает правильно? Ведь если дефолного нет, то он создастся автоматически, если такой понадобится. Нет. Не создастся. Конструктор по-умолчанию создается только если у класса не указаны другие конструкторы. Поэтому если его не указать, у NormalCat будет только один конструктор (с одним аргументом). В вашем примере конструктор без аргументов действительно не нужен. В других случаях может понадобиться. rema174Причем в нем еще вызывается суперконструктор, который является тоже дефолтным для NakedCat (т.к. в нем ничего нет). Похоже на автогенерированный конструктор. Ни на что не влияет. Если не указать super(), родительский конструктор все равно будет вызван. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 10:30:58 |
|
||
|
Не могу понять механизм наследования
|
|||
|---|---|---|---|
|
#18+
ivanraУтверждение, что дефолтный конструктор создается автоматически - неверное, он создается автоматически только если не указано ни одного конструктора maxkarКонструктор по-умолчанию создается только если у класса не указаны другие конструкторы. Поэтому если его не указать, у NormalCat будет только один конструктор (с одним аргументом). В вашем примере конструктор без аргументов действительно не нужен. В других случаях может понадобиться. ок, в данном случает дефолтный не нужен, разобрались. не совсем понятно почему дефолный не создается (если он явно не прописан)? например, изменим код: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. оставим в NakedCat только конструктор с параметром (не дефолтный), чтобы проверить, создастся дефолтный или нет и в мейне вызовем Код: java 1. 2. другими словами, несмотря на то, что другие конструкторы (не дефолные) есть, дефолтный конструктор был вызван, чтобы создать объект nk - а откуда еще берутся объекты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 11:59:35 |
|
||
|
Не могу понять механизм наследования
|
|||
|---|---|---|---|
|
#18+
хотел создать NormalCat, а написал NakedCat... если прописать NormalCat nk = new NormalCat(); то это действительно будет ошибкой компиляции авторjava: constructor NormalCat in class NormalCat cannot be applied to given types; required: java.lang.String found: no arguments reason: actual and formal argument lists differ in length т.е. и в самом деле дефолтный конструктор создается автоматически только если не указано ни одного конструктора ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2013, 12:07:03 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38321503&tid=2129043]: |
0ms |
get settings: |
15ms |
get forum list: |
27ms |
check forum access: |
8ms |
check topic access: |
8ms |
track hit: |
61ms |
get topic data: |
21ms |
get forum data: |
5ms |
get page messages: |
85ms |
get tp. blocked users: |
2ms |
| others: | 289ms |
| total: | 521ms |

| 0 / 0 |
