Á͘˙Œ ˙‚Ý…‹Ÿ‹ ˙Á̓ ̓͂— ԃÁÍ ĹŠ‚‹
˙‹—Á̈́ ÜÁßĎŸß á͂›› ÝßË Ĺ›‹–

Allen Holub ŕ…Œßœ
JavaWorld
͕Îß͟„ ΂œžŒ :݇ͅ›


Á͘˙Œ ̓͂— ˙‚ÔƒÁÍ ĹŠ‚‹ ˙Á̓ ̄͟ ŕÎÁ˜Á á͂›› ڟ

‚›Œ ŕƒ Ţ› :ŋÁ ˙œ‚›Î‚‹ ÝÎÁË̈́˙› ŢŔ ނŸƒ ŕƒ ‚‡œŸÁ ÍË ŕ— ˙›ž› ܍Á :ŕ™‚‹›
ÍßéÔ ŕéƒ Ë霜Á߅ƒ Í՜ ËÍߛ ˙‚Ý͕ ŕ— ˙Áŕœß˜ ŕƒ ÁÍ Ţ‚…Ë— ˙Ëœ‚›Î‚‹ ŕ߉œ
ŕéƒ ˙韂œƒ ͟Π˙–Ôœ› ܲ ß GUI ݅‹Ÿ‹ ͟Πޟƒ ԃÁßÍ ß ËœßŒ ŕ…Š‚‹ ͂—Ëߊ
.ËÁË ÝÁߊ ނŒœ ŹË‹Íƒ ܖÁˉ

.ËéœßéŒ Ü‚é‹ÍÁ Í阌Ÿ‚›œ ŕƒ ‚Ĺ—‡ƒŔ ŕ— Ĺ‹œŸÁ Ůߕ ܗŒ› ‘•Í ˙‚žŒßÍ ÎÁ ˙—Ÿ
Í‚é— ŕÁÍ Ź˙陟šË ŕƒ ˙™ß ËÍÁË Ë̓͂— ˙žŸËƒ ˙‚Ĺ—‡ƒŔ ˙Á̓ ŕߟŒ ޟÁ ŕ…ƒ™Á
ŹÜËé› ÉéÔé‹ Đšé— ˙‚éË…› ÍË ˙—Ÿ•Á͘ ˗ ݂’ËÁ ŕ—œŸÁ ÜßÁ .ˌ‚ƒ˙›œ ˙ƒ‹‚œ›
Ĺé—釃Ŕ ˙‚Ë…› ͋Á͋ ÍË ˙—Ÿ•Á͘ ˗ šß›› .ËÍßŔ˙› ˟˄ ÁÍ áÍÁ˞˜œ Ś—Œ›
Ĺé—釃Ŕ ˙•ÍÔ ÎÁ .Ë΂‹˙› ÍÁßŒË ÁÍ Úˆß— ˜ˆ ͝ ĹÁ͟Ÿ“… ݂‡œÁ ß Ëߌ˙› ъ„
ɟŽß… ÁÍ ˙ÁŕߟŒ Á̙ .ËË ŃŸ‚›œ ÁÍ Ëߊ ٟÍÔ Ëœˆ ŕƒ ˙…‰ÁÍ ŕƒ ËœÁ߅˙›œ ݝ
ÎÁ ß Ë錂ƒ ŕ…ŒÁ˜ ÁÍ MVC (Model/View/Controller) á͂›› ܗŒ› ŕ— ÝË ˙›
ÖÁÎé…éœÁ ÚéŸé—•… ˙œŸ MFC (Microsoft Foundation Classes) ˙™Á Ř˝ ˙•ÍÔ
.ËË Ý‚‡œÁ ÁÍ ‚ŕŸš ŕěÁÍÁ ß (ܲ)



ł•
Üéě‚é– Ĺ߂镅 ŢŔ Ë͕ ŕƒ Í‰œ› ł• ß ˙™— ŗ‡ƒŔ ޟƒ ˟‚ƒ ŹÜ—Œ› ‘•Í ˙Á̓
:ËÍÁË ÁÍ ÍŸÎ ŘŸÍ‚… ÎÁ ˙—Ÿ ŕ ŹÁ͘˙Œ ˙‰ÁÍÔ ˙‚ŸœË ÍË .ݟߌ

͟‚‹ ÎÁ К— ŢËÁË ÍÁ͖ Ο‚›… ˙Á̓ ŕ— ‚Ĺ—‡ƒŔ ˙‚ž‹š— ÎÁ ˙ŠÍƒ ÎÁ ˙˜ĎŸß ڟ
Ź(‚éĹé—é‡éƒŔ ÎÁ ˙鋚é—) salary ŕœß›œ ˙Á̓ .˜ßÍ˙› ͂— ŕƒ Ĺ—‡ƒŔ ˙‚ž‹š—
Î韂é›é…é› (ËÁÍé•Á ݂›…) ‚Ĺ—‡ƒŔ ͅ˜Í΃ К— ÎÁ ÁÍ (ŢÁ˜›Í‚—) employees
ÍéŸé˜éƒ Ůߖ‰ ŢÁ˜›Í‚— ŕ› .˜…‹Ÿœ ˜›Í‚— ŹËœÍŸ˜œ Ůߖ‰ ŕ— áËÁ͕Á .˜—˙›
Í韂‹ ÎÁ ÁÍ ŢŔ ŕ— ‚Ĺ—‡ƒŔ ÎÁ ˙ސƒ ˙˜ĎŸß .ŋÁ ˜›Í‚— ŕ Ůߖ‰ Є .˜…‹
Íé˜éŸËé—éŸ ÎÁ ÁÍ ŢÁ˜›Í‚— ŹËœ›Í‚— ݂œ ŕœß›œ ˙Á̓ ŹËœ—˙› Ο‚›…› ‚Ĺ—‡ƒŔ
˙é› (ŕËéœÎÁËÍé„ ÎéŸÍ ß ËÁ͕Á š†› ) ݝ ÎÁ Áˇ 𛂗 К— ßË .˜—˙› Ο‚›…›
ÎÁ ŢÁËéœé›Í‚— ŢËߛœ Ο‚›…› ˙Á̓ ݂œ Á̙ .˜Œ‚ƒ ŕ…ŒÁË Ý‚œ› ł• ˜œÁ߅
.ËßÍ˙› ͂— ŕƒ (͘ŸË—Ÿ ÎÁ ‚ŕ˜ÎÁË̈́ ÎŸÍ ‚Ÿ) ͘ŸË—Ÿ

ÍéŸ‚é‹ ÎÁ ŹÁÍ ‚Ĺ—‡ƒÁ ÎÁ К— ڟ ˜Á߅˙› ŗ‡ƒŔ :˜…‹ ł• ‚ž‹š— Ë͗™›
.ËË ŇŸŠŒ… ‚ž‹š—


˜…‹Ÿœ ˙Ÿ• ł•
Ĺé–Ë ‚ƒ á͂ŒÁ ĹÍߍ ŕƒ ËœÁ߅˙› Ůߖ‰ ŕœß›œ ˙Á̓ .ŋŸœ ނ‹—Ÿ ˙Ÿ• ‚ƒ ŕ
Ůßé–é‰ ÇÁ͊…‹Á ˙Á̓ ΂Ÿœ ËÍߛ SQL ŕ— ASCII ŕ…ŒÍ Ü‚›Ÿ‹Ë ˗ á͜Ÿ‚ƒ ؏‚Ž›
ŹËߌœ ŕ͟ŠĚ šÁ ˟‚Œ .ˌ‚ƒ ... ß Ëœ—˙› ŕ͟ŠĚ ÁÍ ‚ŕËÁË ŕ‚˜Ÿ‚„ ÎÁ ˙–Áß
ŕéƒé‹‚‰› řßË Ůߖ‰ ŕŸ‚„ š†› ͘ŸË ł• ٟÍÔ ÎÁ Á͇Á ނ›Î ÍË ËœÁ߅˙› ‚›Á
Ůßé–é‰ Îßéœé ˜›Í‚— ŹË͟˜˙›œ ĹÍߍ á΂‹ ŕ͟ŠĚ ŕ— ÍŠŔ ËÍߛ ÍË ˙…‰ .ËË͘
˙éË ÍÁË閛 ŕ‚ƒ…ŒÁ ÁÍ ˙…• ͘Á .˜ÍÁ˜ á͂— á΂‹ ŕ˂Ÿ„ ‚ƒ ł• .Ë͟˜˙›
ŕ˂éŸé„ ˙ÁÍéƒ ŕ— ˙Ÿ‚Ë™Ÿ• ß Ëƒ‚Ÿ ͟Ÿ“… ˜Á߅˙› ŕ ŢŔ á΂‹ ŕ˂Ÿ„ ŹËŸœ—
.˜ß̓ ޟƒ ÎÁ ˜œÁ߅˙› ˜ßÍ˙› ͂— ŕƒ á΂‹

łéŸé™é›é ŕ͂ƒÍË á͟˜ ݟ›… ˙Á̓ ‚žœŔ ŕ— Ĺ‹œŸÁ ł• ˙Ÿ‚‹‚œŒ ˙™Á ܟ™Ë
ŢÁßé…˙› ŹËŒ‚ƒ ŕ…ŒÁË ÁÍ ˙…‚• ‚Ĺ—‡ƒŔ ÎÁ ˙‹š— ͘Á .˜…‹ áÍß͎ Í՜ ËÍߛ
.˜Ë˙› ݂‡œÁ ŕ ŢŔ ‚ƒ ÁÍ á͂— ŕˆ ‚Ĺ—‡ƒŔ ˟‹Í„


‚Ĺ—‡ƒŔ ŕœ Ĺ‚• џ‚›œ
Íéƒ Ř际Š› łƒŸ—Í… ÍË ÁÍ Ĺ—‡ƒŔ Ëː…› ł• ‚… ݟÍÁË Ë– ‘–Áߛ ÎÁ á͂Ÿ‹ƒ
ŹËœ›Í‚— ݂œ Ԗ• ŕ— Ĺ‹Á ÝΚ ł–ßÁ ˙‚˜ .ݟË ނŒœ Ĺ߂•…› ˙‚Í˜ŒŸ‚›œ ˙ßÍ
ŕÁßéŠé™Ë ˙‚éžéœ‚—› ÍË Ĺ‚• ޟÁ ŕ› ß ÝŸË џ‚›œ ÁÍ ˙™› ˗ ‚Ÿ ŹŮߖ‰ ݂œ
Ëé…é› ݂éŸé„ Ĺ陏 ޟ› ŕƒ .˜ŸŔ˙› ÍË ŃŸ‚›œ ŕƒ ŕÔ߃͛ Ý͕ ÍË ‚Ÿ ͘ŒŸ‚›œ
ŕé‡ßé… .Ëéœé—˙é›éœ ͂— (Employee.draw-yourself ˜œ‚›) display-yourself
ŕéŒéŸé›é Źŕœß›œ ˙Á̓ .Ëߌ˙› ŕËÁË ŃŸ‚›œ ٟÍÔ ŢŸ› ŕƒ ÎŸœ ŕ ŕ— ËŸŸ‚›œ
á͂é˜Î‚é‹ Ößéœ ŢéŸÁ ‘–Áß ÍË .ŋÁ т† Ο›› ŕԖœ ‚ƒ Ëˏ ڟ ĹÍߍ ŕƒ Ůߖ‰
ŕéœ Ë霃‚Ÿ ˙› ͟Ÿ“… ł• ÎÁ ˙ƒŸ—Í… .ŋÁ áÍß͎ Ăߊ ˙‰ÁÍÔ ‚ƒ UI ÍË šß››
.ł• џ‚›œ ŕ߉œ

Ń韂›œ ŕ— Ĺ‹Á ˙…—‡ƒŔ ÎÁ UI ˟™ß… á΂‹ Áˇ ŹÍߗ̛ ܗŒ› ˙Á̓ MVC ͂— ŕÁÍ
Ĺé—釃Ŕ şŽß ˙ƒ‚Ÿ…‹Ë ‚ƒ ÁÍ View ŕ— ˙Áŕ˜œ— Üͅœ— ŕÁ͛ ŕƒ ŹËߌ˙› ŕËÁË
ÎÁ Ý韖…‹› ͟’ ÍßÔ ŕƒ ‚Ÿ public ˙‚Ë™Ÿ• Ŋ‚‹ ٟÍÔ ÎÁ ݟ–…‹› ÍßÔ ŕƒ ‚Ÿ)
ß ŕ酕͘ ÁÍ view áËßÍß ŹMVC ŕ˜œ— Üͅœ— ÍßԜŸ› .(accessor ˙‚Ë…› ٟÍÔ
ŢéŸÁ .Ëéœé—˙› ɚÁ ÁÍ Ĺ—‡ƒŔ şŽß ß ÍŸ‹•… calls_to_set ˙‚Ë…› ŕƒ ÁÍ ŢŔ
ÍéŸé’ ͂Ÿ‹ƒ ‚ŕËÁË ŕƒ ˙ƒ‚Ÿ…‹Ë .˜—˙›œ ͂— Á͘˙Œ ݅‹Ÿ‹ ÍË ˙˜Ë‚‹ ŕƒ ŕߟŒ
ŘĚé‰ .ËéŸŔ˙é› Ëßé‡ß ŕƒ view ß Ü˛ ޟƒ ˙•‚ŽÁ ԃÁßÍ ŕ‡Ÿ…œ ÍË ß Ĺ‹Á ˙–Áß
MVC .Ĺé‹Á ˙é†ÍÁ á͂é›éé› ÍË ŕԃÁÍ ŢŸÁ ‚›Á .ŋÁ MVC Ř˝ view ܲ ŕԃÁÍ
Ţ韃 ŕԃÁÍ ŢŔ ÍË ŕ— ËßÍ Í‚— ŕƒ Źcheckbox ˜œ‚› ڈߗ ËÍÁߛ ˙Á̓ ˜Á߅˙›
‚ƒ .ËÍÁ˜ ‚œ› ŢÁ˜ˆ coupling ŕ— Ĺ‹Á ŕ˂‹ áÍ˖ ŕƒ view ß Ü˛ Éԋ şŽß
ܲ á΂‹ Áˇ ˜Á߅˙›œ MVC .˜—˙›œ ܛ Ăߊ áË̓͂— Éԋ ÍË MVC ŹŢŸÁ Ë߇ß
.ËË Ý‚‡œÁ ˙ƒßŠ ŕƒ ÁÍ view ß

ŹÝéË ÍéŸéŸé“… ŕÁߊ™Ë ك‚Ô› ÁÍ Í˜ŒŸ‚›œ ŕ— Ĺ‹Á ޟÁ ˙™• ݅‹Ÿ‹ ÍË Ţ› Ř˝
˙é–éÔéœé› ܲ ͟Ÿ“… Ţß˃ ÁÍ ‚žœŔ ˙Á߅‰› ß ŕËߛœ Ř̉ ß ŕ•‚ŽÁ ÁÍ ˙Ÿ‚Ý͕
ŕ—œŸÁ Ţß˃ ܲ Éԋ á΂‹ ŕ˂Ÿ„ ÍË ÁÍ ĹÁ͟Ÿ“… ݝÁߊ˙› ÍßԜŸ› .ÝË ÍŸŸ“…
˙ÁÍéƒ ÁÍ ˙é‡Í‚éŠ ÝÍé• ÚŸ ÎÁ ˙‰ÍŒ ޟœˆ› .ݜ— ܂›Á ŹËÍÁ̘ ͟†‚… I/O ̓
ÉÍéŒ ÉšéÁ ‚ƒ ß ŕËߛœ ŕ͟ŠĚ (ᘃ͗Ÿ„ ܟ‚• ‚Ÿ ‚ŕËÁË ŕ‚˜Ÿ‚„ ÍË) ŕ›‚œÍƒ
Ůßé• Ü‚›Á ݂‡œÁ Ϝ MVC Ř˝ .ÝË ÍŸŸ“… ÁÍ ŢŔ (ˡ› ܟ‚„›‚— Ţß˃) ŹÝ͕
.˟Ŕ̓ ŢŔ ŕ˞ ÎÁ ˙ƒßŠ ŕƒ ËœÁ߅˙›œ ‚›Á ŹĹ‹Á


ˡ› Ë̓͂— ‚ƒ ԃ…Í› Ü삋›
ŕßéééééŸéééŒ ÍË ŕééé— ËéééœËééé–ééé…éééééé› ËÁÍééé•Á ÎÁ ˙éééŽééééééƒ
Ëßé‡ß ܂éé…Á Ü郂– Á·Á ˟‚ƒ MVC grab the data and shove it into view
Ţé› ŹŢéŸÁ Ëßé‡ß ‚éƒ ."˙ÍÁÎé•Á ÝÍéœ ‘›…‡› ĹÁÍÁ˛" ˙…Í‚ƒ ŕƒ .ˌ‚ƒ ŕ…ŒÁË
‚éƒ ÁÍ ˙Áŕ›‚œÍƒ ˟œÁ߅˙› ‚›Œ .˜œ—˙›œ ͂— ܛ ÍË ˙ŸÁ·Á ޟœˆ ŕ— Ý˖…›
ŕ͂éƒßË ‚éĹ—‡ƒŔ ޟÁ ݜ—˙›œ ͗• ‚›Á .˟΂‹ƒ Á·Á ˙‚Ĺ—‡ƒŔ ޅ‹ßŸ„ ݝ ŕƒ
͘Á ˙…‰ .ŋÁ ܂‰› ˜— ͂— ˙œ…› ͝ ÍË ŕ— ˙‹š— ؟͐… .˜Œ‚ƒ ŕ˂•…‹Á ܃‚–
.ˌ ˝Áߊ ݟ‡‰ ŕ˂™Á Ůߕ К— ˟Ë ݂‡œÁ ÁÍ á͂— ޟœˆ ˟œÁ߅ƒ

˙é‹ÍÍéƒ Ĺé—é‡éƒŔ ŕËéœéœ— ܲ ڟ ŕ‚˜ËŸË ÎÁ ÁÍ Ëˇ› Ř͍› ܗŒ› ˟Ë ŕ΂‡Á
˙é‰ÁÍéÔ ˙Á̓ ŢŔ ÎÁ ŕ— ˙Á ŕœŸ›Î ˙œŸ Źŕ™‚‹› (ŕœ›ÁË) "ŕÎ߉" Ɖƒ› .ݟŸ‚›œ
ŕ›‚œÍƒ ڟ ŕœß›œ ˙Á̓ ͘Á .ŋÁ ݞ› ͂Ÿ‹ƒ Á͘˙Œ ˙‰ÁÍÔ ÍË ŹËŸœ—˙› ŕ˂•…‹Á
ÍË Ĺé—é‡éƒŔ ŕËéœéœ— ܲ .ŋÁ áÍÁ˃‚‹‰ ނ…ŕ™‚‹› ŕÎ߉ ŹËŸ‹Ÿßœ˙› áÍÁ˃‚‹‰
ŕé— ˙酂Ÿ™›) ł• .Ëߌ˙› Η͛…› (ŕÔ߃͛ ŕÎ߉ ÍË) ŕ™‚‹› ؟͐… ̓ Á˅ƒÁ
ÍË ËéŸéœé—˙é› á΂‹ ܲ ŕ— ˙–Áß ˙‚ŸœË ψ ŢŔ (Ëߌ˙› ܟ˃… ł• ŕƒ Áːƒ
ŰéœÍ ‚›Œ ŕœß›œ ˙Á̓ .˜Œ‚ƒ ŕ…‹ƒÁß Ë߇ߛ ŕ™‚‹› ŕƒ ŕ— Ëœ…‹ Í՜ ˛ ˙…Íߍ
‚ß› џÁÍŔ ݅‹Ÿ‹ á΂‹ ܲ ÍË ß› ŰœÍ .˟œ—˙›œ á΂‹ ܲ Ë͕ К— ÍË ÁÍ ß›
.ËÍÁË Ĺ߂•… ͘ŸË—Ÿ ‚ƒ ߛ ß áÍÁ˃‚‹‰ ŕ™‚‹› ŕÎ߉ .Ë͟˜ ˙› ÍÁ͖ ŕ‡ß… ËÍߛ
ŕ˂•…‹Á ܃‚– ݅‹Ÿ‹ ßË Í ÍË ŕ— Ü‚…Á ܃‚– · ‚ƒ Ë͕ К— ޅŠ‚‹ ˙Á̓ њ…
.ŋÁ ŢËÁË Í˝ Ĺ–ß ŹËŒ‚ƒ

ÍË .ݟË˙› ÍÁ͖ ˙‹Í̓ ËÍߛ ÁÍ ÍŸË› ß Ëœ›Í‚— ˜œ‚› á͘ŸË á͂‡… ŗ‡ƒŔ ßË
.ËÍéŸé˜˙é› ÍéŸË› іœ ڟ (˜›Í‚—) ŕ— Ĺ‹Á К— ڟ Ԗ• Źŕ™‚‹› ˙‚ŕÎ߉ ͆—Á
ß Ĺé‹Á Ĺ߂é•é…› ނŒË̓͂— ŕ߉œ ‚›Á ˜ÍÁË ˙žƒ‚Œ› ł• ŢÁ͟˛ ß ŢÁ˜›Í‚—
ŕ› ͟˛ Źŕ™‚‹› ˙‚ŕÎ߉ ͟‚‹ ÍË .˜͟˜˙› ÍÁ͖ ˙•™…Š› ˙‚Ĺ‹Ÿ™ ÍË š‚›…‰Á
.Ë錂ƒ˙› ÁÍÁË ÎŸœ ÁÍ á͘ŸË ˙•‚ŽÁ ł• ‚›Á .ËÍÁË ÁÍ Ëœ›Í‚— ͂…•Í ß Ĺ‚•
ŕ酌ÁË ˙Ÿ‚Ĺ߂•… ŋÁ ޗ›› ŹĹ‹Á ŕˌ مŒ› ˜›Í‚— ÎÁ ŕ— ÍŸË› К— ‚‡œŸÁ ÍË
˜›Í‚— ř‚‰ ޟÁ ÍË .ŋÁ time-sheet Î߇› ŕ™‚‹› ŹŕÎ߉ ͘ŸË ËÍߛ ÍË .ˌ‚ƒ
Č韝 áË͗™› Í՜ ÎÁ ß ŹËË˙› ŕ΂‡Á ˙ß ŕƒ ÍŸË› ß Ëœ—˙› ̈́ ÁÍ time-sheet
ŢÁß霏 ŕƒ ‘–Áߛ ˙ސƒ ÍË Ë͕ ނ› ͘Á .˛Ŕ ˝Áߊœ Ëß‡ß ŕƒ ˙œ‚Œß„› ŕœß˜
˂é‡éŸÁ ˙é™é—éŒé› ŹËßéŒ Üß Ý…‹Ÿ‹ ŕƒ Ëœ›Í‚— ŢÁߜ ŕƒ Ĺ‚–ßÁ ˙‚˜ ß ÍŸË›
ÍÁÍé– ˙é…ß‚•…› ˙‚ž‹š— ÍË Ü›‚— ÍßÔ ŕƒ ÍŸË› ß Ëœ›Í‚— ŕ›‚œÍƒ ŢßÍË .Ëߌ˙›œ
ŕéƒ .ËéœÁŕËéŒ ŘŸÍ… Źŕˌœ ˙œ‚Œß„› ł• ß Ĺ‚Ÿ™› ŕß›‡› ‚ƒ Á͟ΠŹËœÍÁË
ÍéŸ‚é‹ ÍË ŹËéœßéŒ˙é› ˙霂ƒŸ…Œ„ ˜›Í‚— ԋ߅ ܂†› ޟÁ ÍË ŕ— ˙…‚Ÿ™› ŕߚ
.˜ßÍ˙›œ ͂— ŕƒ áË̓͂— ˙‚ŕ›‚œÍƒ

ŕéƒ Ôé–é• ß ËœÍÁ˜ ˙–Áß ˙‚ŸœË ŕƒ ˙Áŕ–š ŢÁ˜ˆ Á͘˙Œ ނ‰ÁÍÔ ŕ—œŸÁ ŕšŠ
ŕéƒ .ËéŒ ËœÁߊ Η͛…› ŹËߌ˙› Ô߃͛ ނŒŕ™‚‹› ŕƒ ŕ— ˙–Áß ˙‚ŸœË ÎÁ ˙ŒŠƒ
Íé˜Á .Ý韜— ŕ˂•…‹Á ‚ĹŸŽß ŕ› ˙Á̓ ˜›Í‚— К— ÎÁ ݟœÁ߅˙›œ ‚› ˙…Í‚ƒ
ÝéŸé‡é‰ ß Ô߃͛‚œ ł• ß Ĺ‚Ÿ™› ŕß›‡› ‚ƒ ˟ÍÁË ÁÍ ˙‹š— ޟœˆ ޅŒßœ ˍ–
.ˌ ˟Áߊ ŕ‡Áߛ

ËéŸ‚éƒ Íß՜› ޟÁ ˙Á̓ żĹ‹Ÿˆ ˡ› Ř͍› Є ŹËœ—˙›œ ͂— ܂…Á ܃‚– · ͘Á
Ëé…é› ÚéŸ ˙‚žœ‚›ß˜ÍŔ ŕ› ͘Á .‚Đš— ÍË ŕœ ËŸœ— ˙‹Ÿßœ ŕ›‚œÍƒ ‚ŕԃÁÍ ÍË
áÎ‚é‹ ŕ˂Ÿ„ ‚ž‹š— ԋ߅ ß ËœŒ‚ƒ ŕˌ ŕ…Š‚œŒ ˙‚ÔƒÁÍ ÎÁ ˙ސƒ ŕƒ reference
ÎÁ .Ëéœé—˙雜 ܛ ŹËÍÁ˜ Ëß‡ß ŢŔ К— ŕ— ˙…—‡ƒŔ ˙ßÍ Íƒ ŕ‚˜ˆŸ ˅› ŹËœßŒ
˙‚éĹé—釃Ŕ ŕœ Ë͟˜˙› ÍÁ͖ ŕ˂•…‹Á ËÍߛ ˡ› ŕ— Ĺ‹Á ˅› ޟÁ ˙—Ÿœ—… Í՜
.˅› ŕƒ ŕ˜ߌ ËÍÁß

ŹË΂é‹éƒ ÁÍ ËßéŠ ÍƒÍ‚— ԃÁÍ ËœÁ߅˙› ŗ‡ƒŔ ŕ— ËœÍÁ˜ Í߂ƒ ËÁ͕Á ÎÁ ˙ސƒ
ËÍßé› ŹËËé‡é› ܂éé…Á Üéƒ‚é– Î‡ ڟ ŢÁߜ ŕƒ Ĺ‹œÁ߅˙›œ ˙…—‡ƒŔ ޟœˆ Á͟Î
ÁÍ ŕé…é•Í Í‚é— ŕéƒ ŢŔ ÍË Ĺé—釃Ŕ ŕ— ˙ÁŕœŸ›Î ‚›Œ Ţ߈ .Ë͟˜ ÍÁ͖ ŕ˂•…‹Á
ŢéŸéœéˆ ˙Á̓ ÁÍ ˙ƒ‹‚œ› ̓͂— ԃÁÍ ËŸœÁ߅˙›œ ŕ— ËœË–…› ‚žœŔ .˟‹‚œŒ˙›œ
.˜— ͂— ˙ÁŕœŸ›Î ͝ ÍË ‚… ˟΂‹ƒ ˙…—‡ƒŔ

ÇÍ‚éŠ ÍË ËœÁ߅˙› ˌ‚ƒ ŕˌ ˙‰ÁÍÔ Ăߊ ŕ— ˙…—‡ƒŔ ŕ— ŕË͗ т† ޛ ŕƒ ŕƒÍ‡…
Üéƒ‚é– ˙éƒßéŠ ŕéƒ Ĺ闇ƒŔ ̓͂— ԃÁÍ ˙œŸ ŹËßÍ Í‚— ŕƒ ŕ™‚‹› ŕÎ߉ ܊ÁË ß
Óé–éœ .Ë΂é‹éƒ ÁÍ ÍƒÍ‚— ԃÁÍ ËœÁ߅˙› ŗ‡ƒŔ ŕ‡Ÿ…œ ÍË .Ë߃ ˝Áߊ ˙Ÿ‚‹‚œŒ
ÍéŸÎ á΂‹ ŕ˂Ÿ„ ŕƒ ˙ƒ‚Ÿ…‹Ë ނ—›Á ŕ— ˙Ÿ‚Ë…›) accessor ÍË encapsulation
ŕé›Ëé Ĺ闇ƒŔ ş›‚›… ŕƒ (˜…‹ get/set ĹÍߍ ŕƒ ß Ëœœ—˙› ݝÁ͕ ÁÍ ˙Ÿ‚œƒ
Ă韅ͅ ނ› ŕƒ ÎŸœ ŕ ˙œŸ ŹË߃ ˝Áߊ ͂˜Î‚‹ ̓͂— ԃÁÍ Źŕߚƒ .˜Î˙›
ÎÁ á͂é˜Î‚é‹ ŢéŸÁ ŹËéŒ ŕ͂éŒÁ Íé…éŒéŸ„ ŕ— ŕœß˜œ‚› .ˌ ˝Áߊ ŕËÁË Ţ‚Œœ
.ˌ‚ƒ˙› Á͘˙Œ ˙‚ž›…‹Ÿ‹ ˙‚˙˜ĎŸß


͂— ŕÁÍ
I/O Ü闌› ‘•Í Ëː…› ˙‚ŕߟŒ ÎÁ ˙—Ÿ ŹË͗ ݝÁߊ Ɖƒ ŢŔ ŕ͂ƒÍË ŕ— á͂—ÁÍ
ŕéƒ ‚Ý͕ ̓ ˙œ…ƒ› ß ŕ˂‹ I/O şŽß ˙Á̓ Íߗ̛ ͂— ŕÁÍ .˜—˙› ɟ͌… ÁÍ
ą° ˙éÔ ŕé— ÁÍ ÝËßéŠ ˙ŠŒ ˙‰ÁÍÔ ˙ߘ™Á Íß՜› ޟÁ ˙Á̓ ޛ .˜—˙› ͂— ˙ƒßŠ
Í‚é— ŕéƒ ÝËéŸé›‚éœ "˙鋗Á̈́ ÜÁßϟß" ÁÍ ŢŔ ß ŕË͗ ͂— ˙ƒßŠ ŕƒ ŕ…ŒĚ˜ ܂‹
á͂ééé›éééééé› ˙ééééééŠé… Ĺé™‚é‰ ˙é‹é—ÁÍé„ ÜÁßĎéŸß ˙ßé˜é™Á .ÝÍéƒ˙é›
.ˌ‚ƒ˙› (CAP) Control/Abstraction/Presentation

ܖ…‹› ÍßÔ ŕƒ ß˜™Á .Ëߌ˙› ،— ŕ—™ƒ ŹËߌ˙›œ ÖÁͅŠÁ ŕ‚˜ˆŸ ˙‰ÁÍÔ ˙ߘ™Á ڟ
ŕé— ÝÍÁË ÚéŒ Ţé› .˃‚Ÿ ˙› ŕ‹ß… Źŕƒ‚Œ› Ś—Œ› ܉ ˙Á̓ ؙ…Š› ނ‰ÁÍÔ Ô‹ß…
ÝËÍéƒ Í‚— ŕƒ ÝŸ‚Í‚— ÍË ‚Í‚ƒ ÁÍ ŢŔ Á͟ΠŹËŒ‚ƒ ߘ™Á ڟ "˙‹—Á̈́ ÜÁßϟß"
.ŋÁ ˂œ› ˙‰ÁÍÔ Ć‰‚ƒ› ˙Á̓ ˋÍ˙› Í՜ ŕƒ ß


˙Á΅œÁ ŕŸš
˙韂Ĺ—‡ƒŔ ÎÁ ˙ß͘ - ݛ‚œ ˙› ˙–Ôœ› ܲ ÁÍ PAC á͂››ÍË ˙Á΅œÁ ŕŸš ޛ
.Ëéœéœé—˙é› áÎ‚é‹ ÜËé› Źŕ™‚‹› ŕÎ߉ ÍË ÁÍ ÖÁ΅œÁ ݟ‚•› ݟ–…‹›ÍßÔ ŕƒ ŕ—
ÜéŸé™é‰é… ß ŕŸÎ‡… ˜ŸÁ͕ Üߍ‰› ŹËœœ—˙› ؟͐… ÁÍ ‚Ĺ—‡ƒŔ ޟÁ ŕ— ˙Ÿ‚ž‹š—
ŹËœ›‚œ ˙› "˙͂‡… ˙‚Ĺ—‡ƒŔ" ÁÍ Éԋ ޟÁ ˙‚Ĺ—‡ƒŔ ËÁ͕Á ł–ßÁ ˙‚˜ .˜…‹
ÍË Ôé–é• ŕé— Ĺé‹éœéŸÁ ͘œ‚Ÿƒ ɚԍÁ ޟÁ Á͟Πݘ‹„˙›œ ÁÍ ŢŔ ޛ ŕ…ƒ™Á ŕ—
.ŋÁ Ü˂› MVC ÍË "ܲ" ‚ƒ ˙Á΅œÁ ŕŸš .ËÍÁË Ë̓͂— á͂‡… ˙‹Ÿßœ ŕ›‚œÍƒ


ŕěÁÍÁ ŕŸš
ÍÁÍé– ŕéěÁÍÁ ŕ韚 ÍË ŹËéœÍÁË ÁÍ Í阌Ÿ‚›œ ˙ßÍ Íƒ ݟ‹Í… ŕ•ŸŐß ŕ— ˙Ÿ‚ž‹š—
܂é‹ÍÁ ˙éÁÎé…éœÁ ŕ韚 ÍË ÁÍ ‚ž‹š— ÎÁ ŕ ˜ˆ ‚Ÿ ڟ ‚ž‹š— ޟÁ .˜͟˜˙›
˙韂é˙‹—Á̈́ ‚žœŔ Á͟ΠŹÝ͟˜˙› Í՜ ÍË ˙‹—Á̈́ ÜÁßĎŸß ÁÍ ‚žœŔ ޛ .˜œ—˙›
Í阌Ÿ‚›œ á΂‹ Å͛ ŕ•ŸŐß ŕ— Üͅœ— ŕŸš .˜…‹ ˙Á΅œÁ ŕŸš ˙‚Ĺ—‡ƒŔ ˙Á̓
ŕŸš ÎÁ ÁÍ ˙‹—Á̈́ ÜÁßĎŸß ŹËÍÁË ŕ˞Íƒ ÁÍ ÍƒÍ‚— ˙Á̓ şßÍ Üƒ‚– ˙Áŕœß˜ ŕƒ
ÜÍé…éœé— ŗ‡ƒŔ ŕ‚˜ËŸË ÎÁ ‚˙‹—Á̈́ ޟÁ .˜—˙› ŋÁߊÍË ˙Á΅œÁ ˙Ÿ‚œƒ ͟Î
Í՜ ÍË JComponent ˙‚Ĺ—‡ƒŔ ÁÍ ‚žœŔ ‚á΂‹ ŕ˂Ÿ„ ÍË Ţ› .˜…‹ Ë͇› 𛂗
.ËÍÁ˜ Ëß‡ß Í˜ŸË ŕŸš ßË ß Üͅœ— ŕŸš ޟƒ á˜ߟ„ ȟ ŹÁ̙ Ý͟˜˙›

‚é›Á ŹËÍÁË Ëßé‡ß tight-coupling ŢŔ ˙‹—Á̈́ ˙‚ž‹š— ß ˙Á΅œÁ ŕŸš К— ޟƒ
‚éƒ ËéŸ‚éƒ ˙Á΅œÁ ŕŸš ˙‚Ĺ—‡ƒŔ .˜ÍÁ˜ ͘ŸË—Ÿ ‚ƒ á˜ߟ„ ȟ ˙‹—Á̈́ ‚ƒ
Ĺ闇ƒŔ ٟÍÔ ÎÁ Ԗ• ‚˙‹—Á̈́ ޟƒ Ԃƒ…ÍÁ ‚›Á ŹËœÎ‚‹ ÍÁ͖̓ Ԃƒ…ÍÁ ͘ŸË—Ÿ
˙‚éžé›‚éŸé„ ŕœß›œ ˙Á̓ ) .Ëߌ˙› ÍÁ͖̓ ( ŕ…Š‚‹ ÁÍ ‚žœŔ ŕ—) ˙Á΅œÁ ŕŸš
.(˜ƒ‚Ÿ˙› ނŸÍ‡ ܲ ŕŸš ŕƒ ŕŸÁÍÁ ŕŸš ÎÁ "‚›Ÿ–…‹› event-style

ŕéěÁÍÁ ŕŸš ޟƒ Ԃƒ…ÍÁ áÍÁ͖̓ ˙Á̓ ˙ƒ‹‚œ› ŕÁÍ "separable-model" á͂››
.ŋÁ ˙Á΅œÁ ŕŸš ß

܂é†é› ŹŢŔ ˙ßÍ Íéƒ Ü˛ ͜ Ţß˃ (View/Controller ‚Ÿ) Swing_UI_Delegate
‚éŸ List_Model Ëéœéœ‚›) "Swing-Model" ŗ‡ƒŔ .ŋÁ ˙‹—Á̈́ ÜÁßĎŸß ÎÁ ˙ƒßŠ
Í‚é— ŕƒ ˙Á΅œÁ ŗ‡ƒŔ ŢßÍË Ĺ‚• ÎÁ ˙ސƒ ř‚‰ á΂‹ ŕ͟ŠĚ ˙Á̓ (Document
.ŋÁ ˙Á΅œÁ ŕŸš К— ÎÁ á˙Ÿ• ‘–Áß ÍË ß ËßÍ˙›

˙é‹é—Á̈́ ÜÁßĎŸß ŕěÁÍÁ ŕŸš ŕ—Ÿ›‚˜œ ÍË (JTextField‚Ÿ JList) UI_Delegate
UI Delegate ނé›Î ŢŔ ÍË ß Ëߌ˙› ŕ…Š‚‹ ŹËœ—˙› ŋÁߊÍË ˙Á΅œÁ ŕŸš ÎÁ ÁÍ
ÍË "‚é›éŸé–é…é‹› ŕěÁÍÁ ś‹ ÍË ˙‹—Á̈́ ĹÁ͟Ÿ“… .ËË͘˙› ܍…› ܲ ŗ‡ƒŔ ŕƒ
˙éÁ΅œÁ ŕŸš ř‚‰ ˙œ‚‹ÍÎßÍ ŕƒ Swing .˜ƒ‚Ÿ˙› Ђ—œÁ Ź˙Á΅œÁ ś‹ ŗ‡ƒŔ
Ĺ陂‰ Ź˙Á΅œÁ ŕŸš ŹĹ—‡ƒŔ ŕ‚˜ËŸË ÎÁ .ËÍÁË ŕ‡ß… ̓͂— áËÍßÍß ŕƒ Ę‹‚„ ÍË
Ţß͗œ‹ ÎÁ) ˜—˙› ͟Ÿ“… ŹŕÔ߃͛ UI Delegate ‚ƒ ̓͂— ŕÍ߂‰› ٟÍÔ ÎÁ ܲ
ŕËÁË Ţ‚éŒéœ ÝÍé• ß ËéŸÍÁË ˙é‹Í…‹Ë ܲ ˙Ÿ• ŕƒ ŕ— ˙…™‚‰ ÍË ˙ƒ‚Ÿ…‹Ë ŢË߃
ŹËÍéƒÍ‚é— ‚éƒ Ôéƒé…Íé› ĹÁÍéŸéŸé“é… .(ËéŸéœé— Üé‚é‰ Ţ‚éœéŸé›éÔÁ ŹËߌ˙›
˙é‹ÍÍéƒ ÁÍ Ĺ闇ƒŔ ř‚‰ ŕ— ˙thread ŕœ ËË˙› ˙ßÍ swing event-loop thread
áËË鐅› ł‰• ÍË Ü˛ ŗ‡ƒŔ ڟ ÍË Ţ‚›Î› ŕ ڟ ŋÁ ޗ›› ޟœˆ› .(˜—˙›
ÁÍ ˙é—ÁͅŒÁ ܲ ÍË ŕˌ ˂‡ŸÁ ͟Ÿ“… ͝ ‚ŕěÁÍÁ ŕ› Á̙ .˟Ŕ ÍË ŃŸ‚›œ ŕƒ
.Ëߛœ ˝Áߊ Зœ›

ß ŕ˂•…‹Á ˙‹—Á̈́ ÜÁßĎŸß ŢÁߜ ŕƒ AWT ŗ‡ƒŔ ÎÁ ŕ— Ĺ‹Á ޟÁ ŕ™‚‹› ͂— ŕÁÍ
listener ŢÁß霏 ŕƒ ÁÍ ˙Á΅œÁ ŕŸš ŗ‡ƒŔ ˙œßÍË Đš— ˙‚Ĺ—‡ƒŔ ÎÁ ˙ސƒ Є‹
ŕ˂镅‹Á Ţß˃ ß ˙‹—Á̈́ ÎÁ "‚›Ÿ–…‹› ‚event ŹÁˡ› .˟œ—Í…‹Ÿ‡Í (ŕ˜ߜŒ)
˙錊ƒ ÁÍ ˙‹—Á̈́ ÜÁßĎŸß .˜ƒ‚Ÿ˙› ނŸÍ‡ ˙Á΅œÁ ŕŸš ŕƒ MVC controller ÎÁ
ßË ÍË Ĺé—釃Á ڟ ˙œŸ :˟œ— Íߍ… ŹË΂‹˙› ÁÍ ŢŔ ŕ— ˙Á΅œÁ ŕŸš ŗ‡ƒŔ ÎÁ
.ނ—›

intergalactic Pan dimensional ˙éÁÎé…éœÁ ŕ韚 Ĺé—é‡éƒŔ .ŋÁ Ńߛ ˙‹—Á̈́
(View) ËéŸéœéŸéƒ˙é› Ţß͟ƒ ÎÁ ŕˆœŔ .á΂ƒ Ì ŕ›ŸŠ ˜œ‚› ‘–Áß ÍË .ˌ‚ƒ˙›
ÎÁ ˙éŒéŠéƒ Ĺé‹Ë .Ëߌ˙› ŕěÁÍÁ ΂ƒ Ì ŕ›ŸŠ ԋ߅ ŕ— Ĺ‹Á ˙ÁŕœÁ˜›Œß ł—͉
.ŋÁ ŕ˟Œ— ͟ߍ… ŕƒ ÁÍ ˙‹—Á̈́ ÜÁßĎŸß ą ܗŒ .ŋÁ ΂ƒ Ì ŕ›ŸŠ


ą ܗŒ



á΂‹ ŕ˂Ÿ„ ŕ͂ƒÍË ˙Áŕ…—œ
ŕ韚 Ĺ闇ƒŔ ޟƒ á͂Ÿ‹ƒ tight coupling ß Ĺ‹Á ˙Á΅œÁ ŕŸš ÎÁ ˙ŒŠƒ ˙‹—Á̈́
ŕ˂éŸé„ ÁÎ釛 ˙‚ž‹š— ˜œ‚› ‚˙‹—Á̈́ .ËÍÁË Ëß‡ß ŢŔ ˙‚˙‹—Á̈́ ß ˙Á΅œÁ
ÁÍ Ĺé•é ڟ ‚… ˜—˙› ŋÁߊ ÍË ˙‹—Á̈́ ÎÁ ˙Á΅œÁ ŕŸš ŗ‡ƒŔ .˜ߌ˙› á΂‹
˙雂阜 ŹĹ‹Á ŕ˂‹ render-yourself ˙υÁͅ‹Á ŕ—Ÿ™‚‰ ÍË Á̙ ŹËŸ‚›œ ܂‹ÍÁ
Ëßé‡ß‚éƒ .ËéŒ‚éƒ ŕ˂‹ ˙•‚— Í˖ ŕƒ ŃËߊ ܂‹ÍÁ ˙Á̓ ŗ‡ƒŔ ŕ— ËÍÁË Ë̓͂—
employee ÎÁ ŢÁßé…˙é› Ü‚é†é› ˙Á̓ Íߗ̛ ˙υÁͅ‹Á ÍË ŕ— ËŸŸ‚›œ ŕ‡ß… ŹŢŸÁ
܂é‹ÍÁ Ź˙é‹é—ÁÍé„ ÎÁ ŕ˂•…‹Á Ţß˃ ÁÍ Ý‚œ ˜œ‚› Ëߊ ŕ ڟ Ԗ• ŕ— Ĺ‹Áߊ
.˟‚›œ

ŕƒ ÁÍ Đš— ˟Áߊ˙›œ ŕ— Ĺ‹Á ݙ‹› ˟ŒŸËœÁ˙› ܂…Á ܃‚– Á·Á ŕ͂ƒÍË ŕ‚˜Í
ß Ë韜— ˙‹ŸßœÎ‚ƒ ŹÍ˜ŒŸ‚›œ ˙ßÍ Íƒ ŗ‡ƒŔ ÍßžŐ ŕ߉œ ŢËÁË ÍŸŸ“… ˙Á̓ ˙˜Ë‚‹
.ŋÁ reneder-yourself ˙υÁͅ‹Á Ś—Œ› ÎÁ ͘ŸË ˙—Ÿ ޟÁ

ËéœéœÁßé…˙› ˙–Ôœ› ܲ ˙‚ž‹š— ŹĹ‹Á ˙ŸÁ·› К— ˙‹—Á̈́ ÜÁßĎŸß ŕ—Ÿě‚‡œŔ ÎÁ
.˜œ— ŕŸž… ÁÍ ŢŔ ˙‚Ĺ—‡ƒŔ

.ËéŒ ËÁߊ Áˇ "˙͂‡…" ˙‚Ĺ—‡ƒŔ á΂‹ ŕ˂Ÿ„ ÎÁ view á΂‹ ŕ˂Ÿ„ ޟÁ̓‚œƒ
ŕ韚 ŕƒ Ü‚…Á Ţß˃ ŹÜ›‚— ÍßÔ ŕƒ ËœœÁ߅˙› á͂Ÿ‹ƒ ˙‚˙‹—Á̈́ Źevent ͝ ÍË
ŢÁß霏 ŕƒ ËœÁ߅˙› Swing_JTextField ŕœß›œ ˙Á̓ .˜ߌ á΂‹ ŕ˂Ÿ„ ˙Á΅œÁ
ËÍßé› ŕËéŒ ŕÍéŸéŠĚ Document ŗ‡ƒŔ ÍË ŢŔ ř‚‰ ŕ— ˙Á΅œÁ ŕŸš ŕ ˙‹—Á̈́
ÉéÔé‹ Ĺé—釃Ŕ Ë͗™› ŕ߉œ ŕƒ JTextField ޟÁ Ëß‡ß ‚ƒ .Ë͟˜ ÍÁ͖ ŕ˂•…‹Á
.ŋŸœ ؖÁß ˙Á΅œÁ

áÎ‚é‹ ŕ˂Ÿ„ ˙Á̓ ͅ˙™ŠÁË ˙‚ž‹š— ÎÁ ݝË˙› ɟ‡Í… ޛ ŹÝ…•˜ šƒ– ŕ— ÍßԜ‚›
ÎÁ ŕ˂é•é…é‹Á ÁÍéŸÎ ŹŕËéŒ Ůé…éŒé› ˙‚ž‹š— ‚… ݜ— ŕ˂•…‹Á ݝ ŕƒ ‚˙‹—Á̈́
.˜—˙› ŢÁ͘œ Á͛ Á߂‡ ÍË protected

ŕé— ˙é…é—釃Ŕ ß ˙‹—Á̈́ ޟƒ ˜Á߅ƒ Ԗ• ŕ— ÝŸÎ‚‹ƒ ˙ԃÁÍ ÝŸÁߊ˙› ‘–Áß ÍË
ŕéƒ ËéœÁßé…˙› ˙‹—Á̈́ ŢŔ Á̙ ËßÍ Í‚— ŕƒ Ëœ…‹ tight couple ß ËË˙› ނŒœ
Ôé‹ß… ÁÍ Ë…› ޟÁ" ˟œÁ߅˙› ‚›Œ ŹÜÁŕ˟Á ř‚‰ ÍË .Ëߌ ˙Ë ÍÁ˖› ɟ‰ ÍßÔ
˙™ß ŹĹ‹Ÿœ ˙™› (C++ ‚Ÿ) Á߂‡ ÍË Í‚— ޟÁ ‚›Á "˟œÁߊƒ Á͕ К— ŢŔ ˙‚Ë…›
áÎ‚é‹ ŕ˂éŸé„ ˙éÁ΅œÁ ŕŸš К— ˙œßÍË Đš— ŢÁߜƒ ÁÍ ˙‹—Á̈́ К— ˟œÁ߅˙›
ŕéƒ ËéœÁ߅˙› ͅ˙œß͟ƒ К— ŗ‡ƒŔ ߅ͅ ޟ˃ .˟œ— private ÁÍ ŢŔ ß ŕËߛœ
˙œßÍË Đš— private ˙‚ŃŠƒ ŕƒ Í…˙œß͟ƒ К— Á͟Î) ˌ‚ƒ ŕ…ŒÁË ˙‹Í…‹Ë ‚Ë…›
Íé˜Á .˜— Á˟„ ˙‹Í…‹Ë ‚žœŔ ŕƒ ËœÁ߅˙›œ á͘ŸË Ë͕ ȟ ‚›Á Ź(ËÍÁË ˙‹Í…‹Ë
ËéœéœÁ߅˙›œ ŕˌ مŒ› ˙‚ž‹š— ͘ŸË ŹËŸœ—˙› ŕ˂•…‹Á ˙œßÍË Đš— ˙υÁͅ‹Á ÎÁ
ÁÍéŸÎ Ý韋ߜƒ ÁÍ áͅɟ‰ ˗ ‚… Ëߌ˙› Ë şËßˉ› ޟÁ .˜œ— ŕŸž… ˙‹—Á̈́
ŕË͗ т† ޛ ŕƒ ŕƒÍ‡… .ݟË ͟Ÿ“… ÁÍ ˙‹—Á̈́ џ‚›œ ŕ߉œ ‚… ݟ…‹Ÿœ Í߃‡›
ÍË ˙é…é‰ ŹËéË˙é› Ń韂é›éœ ĹÍߍ ނ› ŕƒ ŕ•Ë Í ÁÍ ŃËߊ ŹĐš— ͝ ŕ ŕ—
ÁÍ ˙镙…Š› łŒŸ‚›œ ˜Á߅ƒ ŕ— ÝŸ‹Ÿßœƒ ˙Ÿ‹—Á̈́ ˟‚ƒ Á̙ ŹŘ™…Š› ˙‚ŕ›‚œÍƒ
ŕ˂镅‹Á Gang of four command ŗ‡ƒŔ ÎÁ ˟‚ƒ Íß՜› ޟÁ ˙Á̓ ß Ëœ— ŕÍÁËÁ
áËËé Ĺ‚é• ÎÁ ˙ސƒ ˙Á̓ ÁÍ Number Format ݜÁ߅˙› ޛ Źŕœß›œ ˙Á̓) .Ëߌ
.(ݟߘƒ ˙‹—Á̈́ ŕƒ ÁÍ á˜ƒ ś͕ ŕ߉œ ß Ý…‹Í•ƒ ˙‹—Á̈́ ŕƒ


Üͅœ— ŕŸš
ÍË ‚éžœŔ ͜ ß Ü˛ ÎÁ ‚˙‹—Á̈́ ŋÁߊÍË ‚ƒ view ˂‡ŸÁ Üͅœ— ŗ‡ƒŔ ŕ•ŸŐß
˙ÁÍéƒ ß ËéŒ‚éƒ ˙Á΅œÁ ŕŸš ŗ‡ƒŔ ڟ Ëߊ ˜Á߅˙› Üͅœ— ŗ‡ƒŔ .ŋÁ ߘŸß
.(ŋÁ ˙…Œ˜Î‚ƒ á͂›› ޟÁ) Ëߌ ŕěÁÍÁ ˙™— Ý͕ ÍË Ü‚†›

.Ëéœé…‹ ЂŸ–› ܃‚– MVC ÍË view ß Ü˛ ‚ƒ áˉ ‚… ŕěÁÍÁ ß ˙Á΅œÁ ˙‚ŕŸš
ŕé— Ĺé‹Á ˙é…é—釃Ŕ MVC ÍË Controller .ËÍÁ˜ ˙…™‚‰ ޟœˆ Üͅœ— ŗ‡ƒŔ ‚›Á
.Ëéœé—˙› ͟‹•… ܲ ś‹ ˙‚Ý‚Ÿ„ ŕƒ ÁÍ ‚žœŔ ß ŕ…•Í˜ ÁÍ view ś‹ ˙‚event
ÎÁ ‚é›éŸé–…‹› ‚Ý‚Ÿ„ .ŋÁ ܂• ͟’ ݂Ÿ„ ނŸÍ‡ ŕœŸ›Î ÍË PAC Üͅœ— ŗ‡ƒŔ
ŕé— ˙Ÿß˜Ÿß .ËßÍ˙› ŹË΂‹˙› ÁÍ ˙‹—Á̈́ ŕ— Ü˛ ś‹ ŗ‡ƒŔ ŕƒ ˙‹—Á̈́ ÜÁßϟß
.Ëߌ˙›œ ͟˜ÍË Ý‚Ÿ„ ނŸÍ‡ ÍË šß›› Ëߌ˙› ŕ…Š‚‹ view ŢŔ ÍË



á΂‹ ŕ˂Ÿ„ - á΂‹ ܲ
ŢéŸÁ .Ýéœé—˙› ɟ͌… ÁÍ ŕ˂‹ ß Ĺƒ‚† ݅‹Ÿ‹ ڟ ‚ƒ ˙‹—Á̈́ ÜÁßĎŸß á͂›› ޛ
ŕé— ˙éŸ‚é ˙‹—Á̈́) ˝Ë˙› џ‚›œ ÁÍ ‚˙‹—Á̈́ ŕ— Ë΂‹˙› ŕ˂‹ Ý͕ ڟ ݅‹Ÿ‹
.˜ÍÁË ÍÁ͖ Ý͕ ÍË ˙…ƒ‚† ܉› ÍË ‚˙‹—Á̈́ .(˜Ë˙› ނŒœ ÁÍ Ü˛ ś‹ ł•
.ŋÁ Ԃƒ…ÍÁ ÍË Á߂‡ UI ‚ƒ Layout Manager ŕߟŒ ŕ…ƒ™Á

ŕËéŸéŒ—͟ߍ… ŕƒ ł ß ˛ ܗŒ ÍË ‚Ÿß„ ß ‚…‹ŸÁ ܲ ˙‚ÍÁËߛœ ÍË ‚Ý͕ ݅‹Ÿ‹
ÔéƒÁÍ User Interface ‚é‡éœéŸÁ ÍË .ŋÁ ŕ˛Ŕ ˛ ܗŒ ÍË ‚…‹ŸÁ ܲ .ŋÁ ŕˌ
User Interface ˟‚ƒ ˙‹š— ŹËߌ ŕËÁË Ţ‚Œœ ͘ŒŸ‚›œ ÍË ŕ—œŔ ˙Á̓ .ŋÁ ˙™Á
˙ÁÍéƒ ÁÍ ‚é˙é‹é—Á̈́ ÜÁßĎŸß ŹŢŔ ŋÁߊÍË Ý‚˜œ ÍË ß ŕËߛœ á΂‹ ŕ˂Ÿ„ ÁÍ
ÁÍ JComponent ŕé— ˙é‹šé— Íé ÎÁ ˙Áŕéœß›œ ĹÍߍƒ ‚˙‹—Á̈́ .˜— ŕŸž… ł•
.˜ߌ˙› ŕ˜ÁË͘ ΂ƒ ŹËœ—˙› á΂‹ ŕ˂Ÿ„


˛ ܗŒ


ÎÁ ‚é˙é‹é—ÁÍé„ Ĺé‹ÁßéŠÍË ŢŔ ŕ镟Őß .ŋÁ PAC Control ŗ‡ƒŔ ڟ Form К—
ÝÍé• .Ë錂éƒ˙› ͘ŒŸ‚›œ ˙ßÍ̓ ‚ ˙‹—Á̈́ á΂‹ Å͛ ß ŃŸ‚›œ ܃‚– ˙‚Ĺ—‡ƒŔ
ŕéƒ ˙™— Ý͕ ÎÁ ΂Ÿœ ĹÍߍ ÍË ËœÁ߅˙› ŗ‡ƒŔ Á̙ ŹËË˙› ԋƒ ÁÍ JComponent
˙ßé˜é™Á ÝÍé•-ŢßÍË-Ĺé›Íé• ŕßéŸéŒ ŢéŸÁ) Ëéœé— ŕ˂é•é…é‹Á ˙é‹é—ÁÍé„ ŢÁߜ
.(ŋÁ Gang of Four Composite

ËéœéŸŔ˙› ÍË ŃŸ‚›œ ŕƒ Ý͕ ˙ßÍ̓ ŕ— áËː…› ˙‚Ĺ—‡ƒŔ ł• ˙ƒ‚ŸËÍ ˙Á̓ Ý͕
String ŹElement .Ëéœé—˙é› ŕ˂é•é…é‹Á (Private ˙é™éŠÁË Đš—) Elements ÎÁ
˟œ— ŕ‡ß… .ËÍÁË˙› ŕ˜œ ŹËœœ—˙› ˙Ÿ‚‹‚œŒ ÁÍ Ĺ• ˙›‚‹Á ß Đš— ŕ— (˙Ÿ‚ŕ…ŒÍ)
˙é…é‹ÍË ŕéƒ ÁÍ Í‚é—霟Á ÉÁÍÔ Í˜Á .Ëߌ˙› ŕ͟ŠĚ (˙Ÿ• ݂œ ŕœ) ŕ ݂œ ŕ—
ŕ˂éŸé„ ËéœßÍ ˙Ô ÍË ‚Ë™Ÿ• ŕ—™ƒ ˜—˙›œ ͟Ÿ“… К— ŕß›‡› ŕ ŹËË ݂‡œÁ
.˜ƒ‚Ÿ˙› ͟Ÿ“… á΂‹

Ýé is invariant) invariant :ËßéŒ˙é› ˙霂ƒŸ…Œ„ Element ŗ‡ƒŔ Öߜ ßË ÎÁ
.‚éicon ß slabel Ëéœéœ‚é› Ë霂é›˙é› Ĺƒ‚† Ý͕ џ‚›œ ݂˜œ ŕ— (ŋÁ ŋÍË
ÁËé ‚ƒ invariant ͍‚œ .˜…‹ invarian ‚icon ß ‚label ˜œ‚› ˙Ÿ‚ÎŸˆ
ÝÍé• ÍË add field(invariant: JComponnet, location:Rectangle) Ë酛 ŢË͗
ނ雝 ‚ƒ Element ŕ˜΂‹ÎÁ ŕ˂•…‹Á ‚ƒ) ÁÍ Ă‹‚œ› Element ŕ— ËœÍŸ˜˙› ÍÁ͖
.Ë韂é›éœ˙é› ŕ›Ÿ›Ž ‚Ë™Ÿ• ŋŸ™ ŕƒ Á͜Á ß ŕ…Š‚‹ (add field() ˙‚Ţ‚›ß˜ÍÁ
ŕËéŒ ŢéŸéŸé… ܉› ÍË invariant JComponent ˙Œ ŹËË͘˙› ܂• Ý͕ ŕ—Ÿ›‚˜œ
.Ëߌ˙› ŕËÁË ŃŸ‚›œ ß ŕ…•Í˜ ÍÁ͖

ł• ÎÁ ˙ސƒ ͘œ‚Ÿ‚›œ ˜…‹Ÿœ invariant ŕ— ˙Ÿ‚Ë™Ÿ• ŕ› ŕ— Ĺ‹œŸÁ ̓ Ó͕
ŕé— add-field ˙‚éŕéŠé‹œ ͟‚‹ ڛ— ‚ƒ ‚Ë™Ÿ• ޟÁ .˜Œ‚ƒ˙› ‚ž‹š— ÎÁ ˙ސƒ
.ËÍÁË˙› ŕ˜œ ÁÍ Ĺ• ݂œ ß Đš— ݂œ ŕ— ˙Ÿ‚ŕ…ŒÍ

ĹÍßé ŕƒ ŕœ .˜ߌ˙› ŕ͟ŠĚ ŕ…ŒÍ ĹÍߍ ŕƒ Ĺ‚• ˙›‚‹Á ß Đš— ŕ— ËŸŸ‚›œ ŕ‡ß…
ŕéƒ ÁÍ ÝÍé• ŘéŸÍ鐅 Ź‚ŕ…ŒÍ Ë̓͂— .instantiated ˙‚Ĺ—‡ƒŔ ŕƒ reference
ŕéƒ ÎŸœ Ý͕ ɚÁ .˜—˙› ނ‹Ŕ ‚ŕËÁË ŕ‚˜Ÿ‚„ ÍË ˙™ßˇ ‚Ÿ ASCII ܟ‚• ĹÍߍ
.ŋŸœ ˡ› ܟ‚„›‚— ŕƒ Î‚Ÿœ ß Ë͟˜˙› ݂‡œÁ ASCII ܟ‚• ޟÁ ɚÁ ‚ƒ ˙˜Ë‚‹
layout ˟œÁ߅˙› ‚›Œ .ŋÁ ܲ ÎÁ view á΂‹Áˇ ˙™Á ъƒ á̄͟ ؂ԐœÁ ޟÁ
ÜËé› Íéƒ Ĺ陂é‰éœŸÁ .˟Ë ͟Ÿ“… ˙‹Ÿßœ ˗ ŕƒ Î‚Ÿœ Ţß˃ ÁÍ ‚Ý͕ ߗͅ ß
.ŌÁ̘ ˝Áߊœ ͟†‚…

Load() ˙‚éË…› Ý͕ ÍË ÜŸ‚• ÎÁ Elements áÍÁ̘͂ƒ ˙Á̓ Form К— ÍË Hooks
ËÍßé› ÚéŸ Îé‡ ŕéƒ ß Ëœ…‹ non-final ˙‚Ë…› ‚žœŔ .˜ߌ˙› ŕŸž… store() ß
˙霂éƒéŸé…Œ„ ˙Á̓ ÁÍ ‚žœŔ ˟œÁ߅˙› ‚›Œ .˜Ë˙›œ ݂‡œÁ á͂— 𐕠ʂœ†…‹Á
Ţé› ŕœß›œ ˙Á̓ .˟œ— ˙ŒÍ‚•‹ (Form ÎÁ ˙‹š— ق–…ŒÁ ԋ߅) Ý͕ ؟͐… ݅‹Ÿ‹
˙é›Íé• Load() ˅› :˜—˙› á΂‹ ŕ˂Ÿ„ ͟ΠĹÍߍ ŕƒ ÁÍ Ë…› ßË ŕ— ÝÍÁË ˙‹š—
ŹËéœÁŕËéŒ Áˇ ͘ŸË—Ÿ ÎÁ ‚›‚— ‚ƒ ŢÁ ͍‚œ ŕ— ASCII ܟ‚• ڟ Ţ˜Áߊ ‚ƒ ÁÍ
ÍË ß Element ÚéŸ ÍË ÁÍ ÍéÔé‹ Í ŕ— ĂŸ…Í… ޟ˃ ˜—˙› initialize ÁÍ Form
:˜—˙› ˙Ë ÍÁ˖› ͟Π͟Πق–

x, y, width, height, class_name, attribute_name



Đšé— Ý‚éœé›é ŕ— ˙package ݂œ) Ëߌ ԟÁ͌ ÎÁ͉Á ܛ‚—ÍßÔ ŕƒ ËŸ‚ƒ К— ݂œ
ß ËË͘ ҊŒ› class name ˙Ÿ• ÍË ËœÁ߅˙› java.swing ŕ…‹ƒ ÍË Đš— ͝ .(ŋÁ
ŢŔ ނé›ß˜ÍŔ ŢÁߜƒ attribute_name ˙Ÿ• .ËÍÁË string constructor ڟ К—
‚éƒ ß ÖßÍéŒ < ͅ—Á͂— ‚ƒ attributed-name ͘Á .ËßÍ˙› ͂— ŕƒ constructor
.Ë錂ƒ˙› URL ڟ attribute name ŕ— Ĺ‹Á ޟÁ ̓ Ó͕ ŹËƒ‚Ÿ ŕ›…‚Š > ͅ—Á͂—
‚›Á ŹËߌ˙› ŕ…Š‚‹ ImageIcon ŹËŒ‚ƒ javax.swing.ImageIcon Źclass-name ͘Á
.Ë͟˜˙› ÍÁ͖ JLabel ŢßÍË

ނ›Í• ˙ËßÍß ŹÜ‚†› ˙Á̓

10,20,100,200,javax.swing.JButton,Hello World


:ËË͘˙› ܟ˃… ͟ΠܗŒ ŕƒ

new Element(new Rectangle(x,y,width,height), new JButton("Hello World"));


:Ëߌ˙› ˂‡ŸÁ ͟Πނ›Í• ‚ƒ ŢߗŸÁ ß

10,20,100,200,java.swing.ImageIcon,foo.gif

:Ë͟˜˙› ÍÁ͖ ͟Πق– ÍË ŕ—

new Element(new Rectangle(x,y,width,height), new JLabel(new ImageIcon("foo.gif"));

ß

<http://www.holub.com/images/mooney.jpg> 10,20,100,200,java.swing.ImageIcon,

ŕƒ ÜŸËƒ…

new Element(new Rectangle(x,y,width,height), new Element(new JLabel(new ImageIcon(new URL("http://www.holub.com/images/mooney.jpg") )));


.Ëߌ˙›

ÝÍé• Ń韂é›éœ ˙ÁÍéƒ ÁÍ Í˜ŸË—Ÿ ‚ƒ ‚ž‹š— ޟÁ Ë͗™› ŕ߉œ ˟Ë ŕ΂‡Á ڜŸÁ
ŘéŸÍéé…) Ý͕ á΂‹ ҊŒ› .ËÍÁË Ëß‡ß ‚Ÿß„ ܲ ÍË ßŸÍ‚œ‹ ßË .ݟŸ‚›œ ˙‹Í̓
.(ŢÁ џ‚›œ ß Ý͕ ŕƒ Á͇Á ނ›Î ˙‚Ĺ—‡ƒŔ ŢË͗ ŕ›Ÿ›Ž) á΂‹ ܂• ß (‚Ë™Ÿ•
add_field() Ë酛 ˜ˆ ‚Ÿ ڟ ˟œÁ߅˙› ß "ŋÁ ނ‹Ŕ á΂‹ ҊŒ›" ŕ—Ÿě‚‡œŔ ÎÁ
ÍË UML ˙韂Ÿß„ ܲ ÍÁËߛœ .ÝÎÁË̈́˙› á΂‹ ܂• ˙ߟ͂œ‹ ŕƒ ŹËŸœÎƒ Áˍ ÁÍ
ËéŸËéŸËœ ÁÍ áÍÁËߛœ ޟœˆ šƒ– ͘Á .˝Ë˙› ނŒœ ÁÍ á΂‹ ܂• ˜ŸÁ͕ ł ܗŒ
.ËéœéË˙é› Ţ‚éŒœ Á͇Á ނ›Î ÍË ÁÍ Ý…‹Ÿ‹ ˙‚Ĺ—‡ƒŔ Ź‚Ţ߅‹ ŕ— ËŸě‚›œ ŕ‡ß…
(Ń陕 އ ÍË) ͘ŸË ŗ‡ƒŔ ŕƒ ˙…—‡ƒŔ ÎÁ ŕ— Ĺ‹Á ˙Ÿ‚ž›‚Ÿ„ ͘œ‚Ÿƒ ˙–•Á ÔßԊ
.˜ߌ˙› ܂‹ÍÁ ˙œ‚…‰… ˙‚ž›‚Ÿ„ ÎÁ џ„ ŹÍÁËߛœ ˙š‚ƒ ˙‚Ý‚Ÿ„ .Ëߌ˙› ܂‹ÍÁ


PAC ˙‚Ÿß„ ܲ : ł ܗŒ




.Ë霅•͘˙› Í՜ ÍË ‚‡—Ÿ ‚Ë™Ÿ• ‚ƒ ÁÍ Form ŗ‡ƒŔ ޟŒŸ„ ˙‚ßŸÍ‚œ‹ ÎÁ ˙ސƒ
ÍË ‚é‡é—éŸ Element Ĺé—é‡éƒŔ ‚éƒ Form--already 𛂗 ‚Í‚— Öß͌ ŕԖœ Á̙
Ëߌ˙› ΂’Ŕ ˙Á΅œÁ ś‹ Üͅœ— ŗ‡ƒŔ ‚ƒ á΂‹ ܂• ˜ŸÁ͕ .Ëߌ˙› ŕ…•Í˜Í՜
attach(things) ݂éŸé„ ĹÍߍ ŕƒ) ˜—˙› ܂‹ÍÁ ÁÍ ˙™ƒ– Populated Form ß
ŕé— ˙Ÿ‚Ĺ—‡ƒŔ Ź"џ‚›œ ܃‚–" ŗ‡ƒŔ ˜ˆ ‚Ÿ ڟ ŕ— Ĺ‹‚œ› ޟÁ ŕƒ things .(
ÁÍ ˙é‹é—Á̈́ ÜÁßĎŸß Î‚Ÿœ ݂˜œ ÍË ß Ëœœ—˙› á΂‹ ŕ˂Ÿ„ ÁÍ user interface
Ëː…› ł• Ý͕ ŢŔ Ђ‹Á ̓ ŕ— Ĺ‹Á ˙…‹ÁߊÍË attach() ݂Ÿ„ .˜œÁË͘˙› ΂ƒ
Element ËÍé•霛 ˙‚Ĺ—‡ƒŔ ŕ™Ÿ‹ßƒ ł• ٟ–Ë ŕß›‡› .˝Ë˙› џ‚›œ ÁÍ Ĺ—‡ƒŔ
.Ëߌ˙› Üͅœ—

ÁÍ attach() ÎÁ Ĺé™‚é‰ ŕé‹ Form ˙‚éĹé—é‡éƒŔ .ÝéŸË͘˙› ΂ƒ ‚…‹ŸÁ ܲ ŕƒ
ŕéƒ ˙é›ßé‹ ß ŕŸÁÍŔ ˙Á̓ ˙›ßË ŹË͕œ› ˙‚Ĺ—‡ƒŔ ˙Á̓ ˙—Ÿ .˜œ—˙› ˙œ‚ƒŸ…Œ„
˙éË ÍÁËé–é› ‚écollection ‚Ÿ ‚Map ÎÁ ˙ސƒ џ‚›Ÿ„ ˙Á̓ .Iterator ĹÍߍ
Ź FORM ÍË ÇÍ‚éŠ ÎÁ ‚éĹé—釃Ŕ ŢŔ ÍË ŕ— ÝËߛœ ŕ˂•…‹Á ˙™Ë› ÎÁ ޛ .Ëߌ˙›
.ËéœÎ‚‹˙› ܍…› Form ŕƒ ÁÍ Ü˛ ś‹ ˙‚Ĺ—‡ƒŔ ß (PUSH ܲ) ˜ߌ˙› "PUSH"
ŕ˂éŸé„ .Ë霗˙› ÇÁ͊…‹Á ܲ ÎÁ ÁÍ Î‚Ÿœ ËÍߛ ˙‚Ĺ—‡ƒŔ FORM ŹPULL ܲ ÍË
.ŋÁ ͅÍÁßŒË PUSH ܲ ‚ƒ ŕ‹Ÿ‚–› ÍË Ü˛ ޟÁ á΂‹

ĂéŸé…Í… ŕƒ ÁÍ ŢŔ ŕ— Ëœ—˙› ˙‹ Form ŹËߌ˙› ŕ›Ÿ›Ž Ý͕ ŕƒ ˙…—‡ƒŔ ŕ—Ÿ›‚˜œ
ނ錜 ÁÍ ŕˌ ŕ›Ÿ›Ž ŗ‡ƒŔ К— ŕ ˙element ͘Á .˜— ŕ›Ÿ›Ž element ͝ ŕƒ
˙ÁÍéƒ Element ÍË attach() ŕéŠé‹éœ .ËßéŒ˙› Í՜ Ř͍ ŋÁߊÍË ŢŸÁ ÎÁ ŹËËœ
Ý‚éœ Element .ËÍéŸé˜˙› ݟ›… ŹŃŸ‚›œ ܃‚– ŗ‡ƒŔ ‚ƒ ŢË͗œ ͂— ‚Ÿ ŢË͗͂—
ނ‹—Ÿ Element ÍË ŕˌ ŕ͟ŠĚ К— ݂œ ‚ƒ К— ݂œ ͘Á ß ŕ…•Í˜ ÁÍ Ĺ—‡ƒŔ К—
Ĺé‹Íž• ( ł• ‚Ÿ) ŕ ˙Á̓ ˙‹—Á̈́ ÜÁßĎŸß ÚŸ displayable ŗ‡ƒŔ ÎÁ ŹËŒ‚ƒ
܂é‹ÍÁ ‚éƒ ł镍 ŕ— ËŸŸ‚›œ ŕ‡ß… .˜—˙› ŋÁߊÍË Element ŕ ˙Ÿ• ÍË ŕˌ
áÎ‚é‹ ÁËé‡ ß "elbayalpsid" Ĺ闇ƒŔ ŕƒ ŹËœ—˙› ŕ͟ŠĚ ÁÍ Ĺ• ݂œ ŕ— ˙Áŕ…ŒÍ
.˜ߌ˙› ŋÁߊÍË á΂‹ ŕ˂Ÿ„ ÎÁ element É͌

ŋÁ ŕ ͘œ‚Ÿ‚›œ ŕ— Ë΂‹˙› ˙JComponent "displayable"Ź Ĺ—‡ƒŔ ř‚‰œŸÁ ÍË
ÁÍéœŔ ŢÁßé…˙é› component ɚéÁ ݂˜œ ÍË Á̙ ŹËߌ˙› ܍…› component ŕƒ ß
ŢŔ ŹÝËߛœ ŕ͂ŒÁ ͅŒŸ„ ŕ— ŕœß˜œ‚› .˜ÁË͘ ΂ƒ ÁÍ component Є‹ ß ŹĹ•‚Ÿ
ÁÍ widget Đé„é‹ ß ŕËߛœ ͜ ÁÍ ˙™‰› ܲ Źŕ…Š‚‹ ÁÍ Swing_widget ˜Á߅˙›
ŹËߌ˙› ŕ…Š‚‹ visual-proxy() ŋÁߊÍË ‚ƒ ŕ— ˙‹—Á̈́ ŗ‡ƒŔ Є‹ .˜ÁË͘ ΂ƒ
.ËË͘˙› ŕ͟ŠĚ Element ŢßÍË

˙é‹é—ÁÍé„ ÜÁßĎéŸß Ë錂éƒéœ ˙—Ÿ Element ÍË ŕˌ ŕ͟ŠĚ ݂œ ‚ƒ К— ݂œ ͘Á
˙invariant ˙™• Element ß ËŒ‚ƒœ null ˙‹—Á̈́ ˙Ÿ• ͘Á .Ëߌ˙›œ ŋÁߊÍË
Źŕˌ ŕ…Š‚‹ ˙˜Î‚… ŕƒ ŕ— ˙‹—Á̈́ ŹËËœ ނŒœ ÁÍ (ŕ͟’ ß icon..label ˜œ‚›)
Element constructor ŹËŒ‚ƒ ŕË߃ invariant ŗ‡ƒŔ ͘Á) Ëߌ˙› ŕ•‚ŽÁ Ý͕ ŕƒ
.ŋÁ ŕËßΕÁ Ý͕ ŕƒ ÁÍ ŢŔ šƒ–

Üͅœ— ŗ‡ƒŔ ŹËœßŒ ܂‹ÍÁ Ý͕ ŕƒ "displayable" ˙‚Ĺ—‡ƒŔ ŕ› ŕ—œŸÁ Ӊ› ŕƒ
.Ë΂é‹˙› ܂• setVisible(true) ‚Ÿ invalidate() ŋÁߊÍË Ü‚‹ÍÁ ‚ƒ ÁÍ Ý͕
‚éœéƒé› К— ‚›Á .Ëߌ˙› ܂‹ÍÁ Form ÎÁ Component_base К— ŕƒ Ĺ‹ÁߊÍË ŢŸÁ
Íé ŕéƒ ÁÍ activate() ˙‚éÝ‚韄 do-layout() .˜—˙› Í˂ ÁÍ do-layout()
ŕƒ SetBounds() ß SetVisible() ˙‚Ĺ‹ÁߊÍË ß ŕËߛœ ܂‹ÍÁ form ÎÁ element
ÁĚé™ ŹËéœÍßŔ ÍË ŃŸ‚›œ ŕƒ ÁÍ Ëߊ ‚žœŔ ‚… Ëߌ˙› ŕ˂…‹Í• ŕÔ߃͛ ˙‚˙‹—Á̈́
ŕé— ˙韂éœéƒ ÍéŸÎ "displayable" ˙‚éĹ闇ƒŔ ‚ƒ ß Ĺ‹Á şßÍ Üƒ‚– Ý͕ ڜŸÁ
ŕé— ËŸŸ‚›œ ŕ‡ß… .Ë΂‹˙› ÍÁ͖̓ Ԃƒ…ÍÁ ˜Ëߛœ ŕŸž… Ý͕ ˙Á̓ ÁÍ ‚˙‹—Á̈́
Ĺ闇ƒŔ .˃‚Ÿ˙› ނŸÍ‡ "displayable" · ŕƒ ˙‹—Á̈́ ÎÁ ‚›Ÿ–…‹› ̓͂— áËßÍß
ŕ˂韄 ŕ߉œ ŕƒ Á·Á ޟÁ ÎÁ ڟˆŸ ޟœˆ› .ËÍÁ˜ ŗ͌ Ԃƒ…ÍÁ ޟÁ ÍË Form
ÉéÔé‹ ˙‚éĹé—é‡éƒŔ ÎÁ ‚ŕËÁË ÇÁ͊…‹Á ˙Á̓ .˜ÍÁ˜ á͂— ŕÔ߃͛ ŕ á΂‹
"set" Ëé…é› Č韝 ÎÁ ‚Ĺ—‡ƒŔ şŽß ɚÁ ˙Á̓ ß "get" ˅› ȟ ÎÁ ˙Á΅œÁ
ŕËߛœ ŕŸž… Swing JComponent ŕ— ˙ԃÁÍ ŮŸÍÔ ÎÁ ‚Í‚— ŕ› .˜—˙›œ ŕ˂•…‹Á
ݟ‚›œ Ř̉ ß ŕ•‚ŽÁ ÁÍ ‚Ë™Ÿ• ŹÝË ͟Ÿ“… ÁÍ Ý͕ ݜÁ߅˙› ޛ .Ë͟˜˙› ݂‡œÁ
ŕ•‚ŽÁ ˜Œ‚ƒ ŕ…ŒÁË ÍŸ†‚… ˙Á΅œÁ ŕŸš ˙‚ž‹š— ̓ ŕ—œŸÁ Ţß˃ ÁÍ ˙Ÿ‚Ý͕ ‚Ÿ
ÍßéÔ霟› .ˌ ˜Áߊœ ĹÁ͟Ÿ“… ݂‡œÁ ŕ‡ß…› ‚ž‹š— ř‚‰œŸÁ ÍË .ݜ— Ř̉ ‚Ÿ
˙é„ ÍéŸéŸ“… ޟÁ ŕƒ ‚Ý͕ ŹÝË ͟Ÿ“… ÁÍ ˙Ÿ‚œƒ ͟Πܲ á΂‹ ŕ˂Ÿ„ ޛ ͘Á
ŕŸš К— ˙œßÍË Đš— ŢÁߜ ŕƒ šß›› ˙‹—Á̈́ ŕ—Ÿě‚‡œŔ ÎÁ ŕߚƒ .Ë̓ ˜Áߊœ
Đšé— ÚŸ ˙Á̓ (ŕěÁÍÁ ß á΂‹ ŕ˂Ÿ„) ĹÁ͟Ÿ“… ŕ› Ëߌ˙› á΂‹ ŕ˂Ÿ„ ˙Á΅œÁ
ËÍßé› Đšé— ŕƒ reference ŕ› ˙Á̓ ŕ— Ĺ‹Ÿœ á΂Ÿœ ß Ë͟˜˙› ĹÍߍ ܉› ڟ ÍË
ß釅‹‡ ÁÍ áË̓͂— ŕ›‚œÍƒ ݂›… ŹË— ɟ‰ Ë͗™› ÎÁ ނœŸ›ÔÁ Üߍ‰ ˙Á̓ Í՜
.ŋŸœ ͟Ÿ“… ܃‚– ‚Đš— ß Ĺ‚• ˙›‚‹Á ‚žœ… ŹÝœ—

ŕé—éŸě‚‡œŔ ÎÁ .ˌ‚ƒ˙› Gang of Four ˙‰ÁÍÔ ˙ߘ™Á ÎÁ ˙™‚†› ˙‹—Á̈́ ‘–Áß ÍË
áÎ‚é‹ ŕ˂éŸé„ ŕ͂ƒ ÍË ß‡…‹‡ ˙Á̓ .Ëߌ˙› ŕŸž… ܲ ś‹ ŗ‡ƒŔ ԋ߅ ˙‹—Á̈́
ŕ˂éŸé„ ŕ— Ĺ‹Á ˙…ž‡ ÍË encapsulation ˙…Í‚ƒ ŕƒ Ĺ‹Ÿœ ŕ˂•…‹Á ܃‚– ŗ‡ƒŔ
ŕé…éƒé™Á .Ëéƒ‚éŸ ÍŸŸ“… Ç͂Š ˙‚ŸœË ֚ÔÁ Ţß˃ ˜Á߅˙› ܲ ś‹ ŗ‡ƒŔ á΂‹
ŕß›‡› ͘Á ‚›Á .˝Ë˙› ނŒœ ˜…‹ ŕ…ŒÍ ĹÍߍ ŕƒ ŕ— ˙…‚• ݂œ ŹĹ• ŕß›‡›
Íé ÍË .Ĺé‹Á ŕ酌ÁË Ü‚—ŒÁ ŕŸ™ßÁ ˙‰ÁÍÔ ŕ— Ĺ‹‚œ› ޟÁ ŕƒ ŹËƒ‚Ÿ ͟Ÿ“… ŕ
Ëßé‡ß ŕé— ˙…• ŕ—Ÿ›‚˜œ ˜Á߅˙› ŗ‡ƒŔ ß Ĺ‹Á non-issue ŕ ŢËßΕÁ event
ÁÍ ‚éÔéŠ ˙é˜Ë‚‹ ŕƒ ËœÁ߅˙› ߅ͅ ޟ˃ .˜ÁË͘΂ƒ null ˌ ŋÁߊÍË ËÍÁ˜
.ËÁË ŇŸŠŒ…




á΂‹ ŕ˂Ÿ„
User Interface К— Źą ŋŸ™ .ݟÁË̈́ƒ á΂‹ ŕ˂Ÿ„ Ɖƒ› ŕƒ ËŸË ŕ΂‡Á ڜŸÁ
ÜÁßĎŸß ËœœÁ߅˙› ŕ— ˙Ÿ‚Ĺ—‡ƒŔ) Ëߌ á΂‹ ŕ˂Ÿ„ ‚Ĺ—‡ƒŔ ԋ߅ ˟‚ƒ ŕ— ÁÍ ˙
ŕéƒ Ô߃͛ string ŕ— ËÍÁË Ë…› ڟ ‚–Ÿ–Ë ԃÁÍ .˜—˙› ؟͐… (˜΂‹ƒ ˙‹—Á̈́
ŕ— ËœÁË͘˙› ΂ƒ JComponent ڟ ˅› ޟÁ .˜—˙› ܂‹ÍÁ ÁÍ Í՜ ËÍߛ ŕ ݂œ
ŢŔ ŕ— ˙…—‡ƒŔ ŕƒ ˙‹—Á̈́ ŕ— Ĺ‹Á ޟÁ ̓ Ó͕ .ËßÍ˙› ͂— ŕƒ ˙‹—Á̈́ ŢÁߜ ŕƒ
ÍÁÍé–̓ Ԃƒ…ÍÁ ͘ŸË—Ÿ ‚ƒ ˜œÁ߅˙› ŗ‡ƒŔ ßË Á̙) ˌ ˝Áߊ ܍…› ŕ…Š‚‹ ÁÍ
(˜΂‹


java.user-interface : ą ŋŸ™


ÁÍ (ŕéÔßéƒÍé› Form К— Ë̓͂— ß) user interface á΂‹ ŕ˂Ÿ„ ŕ߉œ ˛ ŋŸ™
˙ÁÍéƒ ŕé— ÁÍ Form ˙é™‚éŠ Ĺ—‡ƒŔ ڟ (ą´ ÔŠ) Ý͕ static ͟“…› .˝Ë˙› ނŒœ
static Ĺé™‚é‰ ß ËéË˙› ւ‡ÍÁ ŹËßÍ˙› ͂— ŕƒ Employee ˙‚Ĺ—‡ƒŔ ˙Ë ÍÁ˖›
ŕéƒ Ř™…Š› ˙‚Ĺ—‡ƒŔ ˙Ë ÍÁ˖› ˙Á̓ ͂ƒ ޟ˜ˆ ˜Á߅˙› Ý͕ ނ› Á͟ΠËÍÁË
ŢéŸé™ßÁ .Ëéœé—˙› ؟͐… ÁÍ Ý͕ ˙‚Ë™Ÿ• static-initializer Úߙƒ .ËßÍ Í‚—
Name ŕé…ŒÍ ŕ— ˙ƒ‹ˆÍƒ .˜—˙› ŕ•‚ŽÁ ÁÍ invariant ˙Ÿ• add-field ˙œÁߊÁ͕
Ĺ闇ƒŔ ŕ ŕƒ ‚žœŔ .˜…‹ ނ‹—Ÿ ŕÁ͛ invariant ˙‚Ë™Ÿ• ˜—˙› ŕ͟ŠĚ ÁÍ
ŕƒ Ý͕ ˙š‚ƒ Ĉ ś‹ ÍË ŕĎŸß label ޟÁ .˜…‹ Ý͕ ł• ‚žœŔ .˜ߌ˙› ܍…›
ŕéŒß˜ ÍË ÁÍ Î͛ ܋—Ÿ„ ą° Í‚—Ëߊ ÍßÔ ŕƒ Ý͕) ËÍÁË ÍÁ͖ ܋—Ÿ„ ˇľx˛° ĹÍߍ
ÍéŸé‹é•… (10 ß 10) ŕƒ Í‚—Ëߊ ÍßÔ ŕƒ (0 ß 0 ) ł…Š› :Ë͟˜˙› Í՜ ÍË Ý͕
˙éœÁߊÁ͕ ޟÁ .˃‚Ÿ˙› ҂…ŠÁ ˙‹—Á̈́ ŕƒ ˙Ÿ‚Ž• Íߗ̛ ˗ ˛° Ԋ ÍË ß Ëߌ˙›
ŕé— ÁÍ ˙酕 ß Đš— ݂œ JComponent ܂‹ÍÁ ˙‚‡ ŕƒ Ĺ‹Á ˙™ƒ– ˗ ŕŸƒŒ ‚ƒŸÍ–…
.ÝËߛœ ҊŒ› ˌ ˝Áߊ ŕËÁË ŃŸ‚›œ

ŕ陟‹ß ŕƒ Ý͕ џ‚›œ ݂˜œ ÍË ŕ— Ĺ‹Á (łľ Ԋ) visual-proxy() ˗ áːƒ ъƒ
Źsalary Ĺé•é ßË Ë韜—˙› གŒ› ŕ— ŕœß˜œ‚› .Ëߌ˙› ˙œÁߊÁ͕ Form ŗ‡ƒŔ
ĹÍߍ ŕƒ Jlable Á̙ ËÍÁË ˙œËœÁߊ Ԗ• ŕ salary ˙‹—Á̈́ .ˋ‚œŒ˙› ÁÍ Name
Ĺé‹Á ޟÁ ݕ˝ Á͟ΠŹĹ‹Á ͅŕ˟ˆŸ„ ˙›— name ŕ .Ëߌ˙› ŕ˜ÁË͘΂ƒ ˙‹—Á̈́
ÁÍ swing ̓ ˙œ…ƒ› ŕߟŒ ‚‡œŸÁ ÍË .ËË ÍŸŸ“… ÁÍ name ˜Á߅ƒ Ý͕ ̓͂— ŕ—
‚éƒ ŕé— Ĺ‹Á PlainDocument ŗ‡ƒŔ name ŕ ŕƒ Ô߃͛ ˙™ŠÁË ÍÁ˖› .Ý˟Θ̓
Ĺ闇ƒŔ .ŋÁ swing ΂Ÿœ ËÍߛ model · ޟÁ .Ëߌ˙› reference (ł˛ Ԋ) name
˙é…é–ß .Ëߌ˙› ŕ›Ÿ›Ž ܲ ŕƒ ß ŕ…Š‚‹ ´ł Ԋ ÍË JTextField Ź"presentation"
ŕƒ Ý…‹Ÿ‹ ԋ߅ ŕÔ߃͛ PlainDocument ŗ‡ƒŔ ˝Ë˙› ͟Ÿ“… ÁÍ Ţ…› ˙Ÿ• ̓͂—
.ݟœÁߊƒ ÁÍ ŢŔ ݟœÁ߅˙› ‚› ß Ëߌ˙› ˙œ‚‹Í ÎßÍ

constructor ÍË ÁÍ ÝÍé• Employee Ĺ闇ƒŔ .ŋÁ Ý͕ Ŋ‚‹ ˜ŸÁ͕ áːƒ ŕ™‰Í›
˙Ďé…Áͅ‹Á ޟÁ .˜—˙› ˙Ë ÍÁ˖› ÁÍ ŃËߊ Employee ŗ‡ƒŔ ˙œŸ ŹË΂‹˙› Ëߊ
.Ĺé‹Á ÜßÁË酛 Á͘˙Œ ݅‹Ÿ‹ ÍË ÍƒÍ‚— ‚ƒ ŕÍ߂‰› ˙Á̓ (Ëߊ ˙Ë ÍÁ˖› ˙œŸ)
ŕ—™ƒ ŹËŸÎ‚‹œ dialog (Constructor ˙œÁߊÁ͕ ÍË) ΂ŸœËÍߛ łšÔÁ ˗ ˙Á̓
ĂéŸé…Íé… ŢéŸËéƒ .Ë韂›œ ˗ ÁÍ Î‚Ÿœ ËÍߛ łšÔÁ ˟Áߊƒ Constructor ÎÁ
.˟Ë ͟Ÿ“… ˙˜Ë‚‹ ŕƒ ÁÍ ˙Ë ÍÁ˖› Ý͕ ÝßΙ ĹÍߍ ÍË ËŸœÁ߅˙›

ŢéŸÁ .(śś Ԋ) ˜—˙› ŕ›Ÿ›Ž Constructor ˙š‚ƒ ÍË Ý͕ ŕƒ ÁÍ Ëߊ ˙™• ŗ‡ƒŔ
ŹĹé‹ÍË Ĺé›é‹ ÍË ‚žœŔ ͜ ß Ĺ• ßË Ĺ•‚ŸÍË ˙Á̓ Form ‚… Ëߌ˙› Ë łŸ™›
‚é… ËéœÁßéŠ˙› Á͕ ÁÍ hook ˅› Constructor Є‹ ˟‚›œ ŋÁߊÍË ˙‹—Á̈́ Ý͕
łé•é Ĺ陂é‰éœéŸÁ ÍË .(¸ľ Ԋ) Ë΂‹ƒ ÁÍ create_intialization_Form(...)
.Ëߌ˙› ˙Ë ÍÁ˖› Ϝ derived-class


base-class ÝÍé• ˙ß‚é‰ Ú霟Á ŕ—) ŋÁ derived-class ŕˌ ŕ˜ÁË͘΂ƒ ÍÁ˖›
.Ëߌ˙› ŕ˜ÁË͘ ΂ƒ ŢŔ ނ›ß˜ÍŔ Ԗ• Ó͕ џ„ á΂‹ ŕ˂Ÿ„ ÍË (ˌ‚ƒ˙›

ŢŔ ŢËßéŒé˜ ß ÝÍé• ŢËßé›éœ ŕ͟ŠĚ ˙Á̓ ˙Frame ŹEmployee Constructor ڜŸÁ
ŹWait_for_close() (Ý΂é‹éƒ JDialog ŹJfame ˙‚‡ ŕƒ Ý…‹œÁ߅˙› ޛ) .Ë΂‹˙›
ŕé…éƒé™Á .˘ƒƒ ÁÍ Ý͕ ̓͂— ‚… ËÍßÁ˙› ÍË ŮŸ™… ř‚‰ ŕƒ ÁÍ ˙™• thread
Úé›é— ‚éƒ ß thread Ĺ銂‹ ‚ƒ ˜Á߅˙› modless Ý͕ .˟œ‚›ƒ ÍՅœ› ŋŸœ ÝΚ
ÍéŐé…霛 ͘Á ŕ— ËŸŒ‚ƒ ŕ…ŒÁË Ë‚Ÿ ŕƒ .˜‚›ƒ ˙–‚ƒ şßÍ Üƒ‚– ŕÔ߃͛ ͟˂–›
ÁÍ Employee ŕé— "main" ß Swing ˙‚éËÁËéŠÍ ŃÎÁËÍé„ Źthread ßË ËéŸéœ‚雃
Ĺ–Ë ŹËŸœ—˙› ŕ˂•…‹Á ˙υÁͅ‹Á ޟÁ ÎÁ ͘Á Á̙ .Ë߃ ˜Áߊ ܂• Ź ËœÎ‚‹˙›
.˟Ÿ‚›œ

Employee.java :˛ ŋŸ™



˙ÁÍéƒ ÝÍé• aggregation ŕéÔéƒÁÍ .ËßéŒ˙é› áÎ‚é‹ ŕ˂Ÿ„ ´ ŋŸ™ ÍË form К—
ŕéƒ ÁÍ Ô‚ƒ…ÍÁ ޟÁ ޛ .Ëߌ˙› ͟‹•… (˛´ Ԋ) ‚Ë™Ÿ• Ţߟ‹—™— ŕƒ ŢŔ ˙‚Ë™Ÿ•
reference Źcollection ŕƒ ŕ—Ÿě‚‡œŔ ÎÁ ‚›Á .ÝËߛœ á΂‹ ŕ˂Ÿ„ vector ĹÍߍ
Ëé— Íéƒ ŕ— á͘ŸË ˙ÁŕËÁË Í‚…Š‚‹ ‚ƒ ÁÍ vector ŕ˜ŸŔ ÍË ÝœÁ߅˙› ޛ ŹËߌ˙›
˙‚éĹé—é‡éƒŔ ËéœÁ߅˙› Ý͕ ŕ— Ĺ‹œŸÁ ̓ Ó͕) ݟ‚›œ ޟȟ‚‡ ŹËÍÁ̘œ ͟†‚…
ÎÁ ˙韂évector ˙ß‚é‰ ß Ëéœé— ˙éË霂é›Î‚‹ hash Üߡ ÍË ÁÍ Ëߊ Element
Í醗Á ŕ—œŸÁ ܟ™Ëƒ .˜Ë˙› џ‚›œ ÁÍ Í՜ ËÍߛ К— ł• ŕ— ËŒ‚ƒ ‚Element
.(Ë߃ ˝Áߊœ ͟˜›Œˆ ŢÁ˜ˆ ˙ŸŔ͂— Ë߃žƒ ˜ÍÁË ˙›— ˙‚Ë™Ÿ• ‚Ý͕

ŕéƒ ÁÍéœŔ ޛ .˜—˙› ؟͐… ÁÍ Ý͕ ˙‡Í‚Š ŕŒß˜ ŢߛÁ͟„ ˙‚Ž• (ł° Ԋ) INSET
ŕÎÁ˜Á .ݜ—˙› á΂‹ ŕ˂Ÿ„ ˙…‹Ë ĹÍߍ ŕƒ EmptyBorder ŗ‡ƒŔ ÎÁ ŕ˂•…‹Á ˙‚‡
ŮéŸÍéÔ ÎÁ ß ËßéŒ˙é› ŕÍéŸéŠĚ (łą ÔéŠ) preferred_size ÍË ÝÍé• ÍéŐéœ ËÍߛ
Ëéé…é› .Ĺé‹Á ˙郂éŸé…é‹Ë Üéƒ‚é– getPreferredSize() ß getMinimiumSize()
ŕ•‚ŽÁ Ý͕ ŕƒ á˟ˇ ˙Ÿ• ŕ—Ÿ›‚˜œ ÍË (łś Ԋ) update_preferred_Size(...)
ÍË ß Ü‚é‹ÍÁ ÁÍ ŕËéŒ ŕËßÎé•Á ˙Ÿ• ܉› ˅› ޟÁ .ˌ ˝Áߊ ˙œÁߊÁ͕ ŹËߌ˙›
.˜—˙› ˙œ‚‹ÍÎßÍ ŕƒ ÁÍ ŕÎÁ˜Á ÝßΙ ĹÍߍ

Frame šé†é› ŕ— ˙›‚˜œ ÍË ÁÍ Ancestor listener (´ľ Ԋ) Form Constractor
ŕ—Ë߃ ق‡ ޛ ˙Á̓ .˟‚›œ˙› ݟ՜… ˜—˙› ͟Ÿ“… ŢŔ ŕÎÁ˜Á ‚Ÿ Ëߌ˙› ؖ߅›
˙éœÁßéŠÁÍé• ÍË ŕé— ÁÍ ˙韂éthread ÝéœÁßé…˙é› Á̙ ݜ—Á˟„ ÁÍ Ř–ß… ނ›Î
Ëé…é› ß wait() Ëé…é› ŢéŸÁ .Ýéœé— ÍéŒé…œ› ŹËœ…‹ ÍՅœ› wait-for-close()
.˜—˙› encapsulate ÁÍ notifyAll() Ź(ą˛° Ԋ) release()

ß ŹËéœËéŒ ŕËßÎé•Á swing ŕéƒ ÍéŸË ˙›— ŕ‹ß… ŕŠÍˆ ÍË ‚Ancestor listener
ÎÁ ł Ĺé‹éŸé™ ÍË ÁĚé™ .ËÍÁËéœ Ëß‡ß AncestorAdapter ˙Á̓ ˙™Ë‚› ŕœ‚•‹‚…›
.ÝËߛœ ŕ˂•…‹Á AncestorAdapter


AncestorAdapter.java :ł ŋŸ™

ŕéƒ ‚éžéœŔ ŕé›é .ËéœßÍ˙é› Í‚é— ŕéƒ ŢéŸÁ ÎÁ Đé„ ŕé›éŸé›éŽ ؙ…Š› ˙‚Ë…›
ÍË iterator ڟ ÎÁ ˅› ޟÁ .˜ߌ˙› ŕ›Ÿ›Ž (ˇˇ Ԋ) attach(user-interface)
ŕéƒ ŕ— ˙…—‡ƒŔ ŕƒ ‚… ˝Áߊ˙› ˙Ÿ• ͝ ÎÁ ߅ͅ ŕƒ ß Ëœ—˙› ŕ˂•…‹Á ‚Ë™Ÿ•
ŹElement ˙éœßÍË Đšé— ÍË attach ˙éœÁßéŠÁÍé• .ËßéŒ ŕ›Ÿ›Ž ŕˌ ŕ•‚ŽÁ ˙˜Î‚…
ŕé— ˙é…Íߍ ÍË ÁÍ ˙‹—Á̈́ ÜÁßĎŸß ß Ë͟˜˙› ĹÍߍ ‚Ÿß„ ܲ ŮƒÔ (attach(...)
.Ëéœé—˙é› Ĺ‹ÁߊÍË ËŒ‚ƒ ˙—Ÿ ŕˌ ŕ͟ŠĚ Element ÍË ŕ— ˙‹š— ݂œ ‚ƒ К— ݂œ
.Ëߌ˙› ŕ•‚ŽÁ Ý͕ ŕƒ ˙‹—Á̈́ Є‹

ÁÍé• swing ‚éƒ ŕé— Ĺé‹Á (ą°´ ÔéŠ) dolayout() ŕƒ Ô߃͛ á΂‹ ŕ˂Ÿ„ ޟ͊Ŕ
ÁÍ Ëé™éŸ• ͝ ߅ͅ ŕƒ ß Ë͟˜˙› ĹÍߍ ‚Ë™Ÿ• ÍË á΂‹ ŕ˂Ÿ„ .Ëߌ˙› ŕ˜Áߊ
ĹÍߍ (ą¸˛ Ԋ) activate() ˅› ‚ƒ Element ÍË ˙–Áß á΂‹ ܂• .˜—˙› ܂•
ŕ‚ŸÍË ˙Á̓ ÁÍ SetBounds(Location) ß SetVisbible(true) ˅› ޟÁ .Ë͟˜˙›
ŕœß˜œ‚› .˜Áߊ ˙› Á͕ ˂œ› ܉› ÍË ˙‹—Á̈́ ŢË͗ ΂ƒ ß ŕˌ ŕ›Ÿ›Ž ˙‹—Á̈́
ÚéŸ ĹÍßé ŕéƒ ˙é˜Ë‚é‹ ŕéƒ ÁÍ Ý酋Ÿ‹ ޟÁ ˟œÁ߅˙› ŹÝËߛœ ŕ͂ŒÁ ͅŒŸ„ ŕ—
ŃßÍ ŢŸÁ Ź˙͂›› Ţ˜‚‹‚œŒ ˙Á̓ ޛ ‚›Á .˟Ÿ‚›œ á΂‹ ŕ˂Ÿ„ Layout_Manager
.ÝË͗œ Š…œÁ ÁÍ



AncestorListener
ŕé— ˙雂é˜éœ .ÝË͗œ ŕ˂•…‹Á ˙‹—Á̈́ ˙œ‚‹Í ÎßÍ ŕƒ ˙Á̓ ‚Listener ÎÁ ޛ
܂雅‰Á ŹËœ—˙› ͅ‹Ÿ‡Í Listener ŢÁߜ ŕƒ ÁÍ Ëߊ ܲ ś‹ ŗ‡ƒŔ ‚Ÿ ˙‹—Á̈́
ÎÁ ŕéœßé›éœ ˙ÁÍéƒ) subscriber Ĺ闇ƒŔ ŕƒ publisher ÎÁ reference ŕ— ËÍÁË
ŕééƒ ÁÍ garbage-coloected ŕ΂é‡Á (Component ˙‚éListener ŕéƒ Component
.˝˃ subscriber

˛Ŕ ˝Áߊœ џ„ ŹËË ֚ÔÁ ˙Á΅œÁ ŕŸš ŗ‡ƒŔ ŕƒ ˙‹—Á̈́ ŕ—Ÿ›‚˜œ ܗŒ› ޟÁ
ŕŸš ˙‚Ĺ—‡ƒŔ ŕƒ Ĺƒ‹œ áͅ›— ͛ ÜßÔ ËÍÁË ÍÁ͖ ŢŔ ÍË ˙‹—Á̈́ ŕ— ˙›Í• Á͟Î
Íé…é‹éŸ‡Í ˙Á΅œÁ ŕŸš Listener ĹÍߍ ŕƒ ÁÍ Ëߊ ˙‹—Á̈́ ͘Á .ËÍÁË ˙Á΅œÁ
ÍéŸéŸé“é… ܲ şŽß ŕ—Ÿ›‚˜œ ͂—Ëߊ ÍßÔ ŕƒ ËœÁ߅˙› ř‚‰ ޟÁ ÍË) ŹËŸ‚›œ
˙é–‚éƒ ˙é‹é—ÁÍé„ ĹŸŽß ޟÁ ÍË .˟Ŕ˙› џ„ ܗŒ› (˜— ˙œ‚‹Í ÎßÍ ŕƒ Ëƒ‚Ÿ˙›
Řé–ßé…é› ‚ƒ ˙‹—Á̈́ ĹÍߍœŸÁ͟’ ÍË Ëߌ ؖ߅› ˙Á΅œÁ ŕŸš ŗ‡ƒÁ ‚… ˜‚›˙›
.Ë΂‹˙› Ç͂Š ܲ listener ŋŸ™ ÎÁ ÁÍ Ëߊ Ý͕ Ţˌ

˙™Ÿ™Ë ‚žœ… .ŕՕ‚‰ ؂—Œ ˙ßœ ˙œŸ ŋÁ "loiterer" ÎÁ ˙™‚†› ŗ‡ƒŔ Öߜ ޟÁ
˙ÁÍéƒ ŕ— Document ŗ‡ƒŔ ŕ— Ĺ‹Á ޟÁ ˟Ŕ ˙› џ„ ˙™• ܂†› ÍË Ü—Œ› ޟÁ ŕ—
TextComponent ŕéƒ Reference ŹËßÍ˙é› Í‚— ŕƒ name ŕ ˙‹—Á̈́ şŽß ŕ͟ŠĚ
.ËÍé— ËéÁߊœ ˙œ‚‹Í ÎßÍ ŕƒ ÁÍ ŕÔ߃͛ UIDelegate ܲ şŽß ͟Ÿ“… .ËÍÁ˜
Ëé…é› ÚéŸ ËéŸ‚éƒ ŹË霂é‹Í˙é› ÎßÍ ŕƒ ÁÍ name ͂—Ëߊ ÍßÔ ŕƒ employee ͘Á
ÁÍ PlainDocument ˙Ÿ‚œƒ ͟Πŗ‡ƒŔ ‚… Ë͗˙› ܂‹ÍÁ ˙‹—Á̈́ ŕƒ ÁÍ setText()
.ËË ÍŸŸ“…

JComponenet ÍË AncestorListener ÝÎ韜‚—› ÎÁ ŕ˂•…‹Á Íߗ̛ ܗŒ› ͂— ŕÁÍ
ŕéƒ ÝšéÁ ˙ÁÍéƒ (´ľ ÔéŠ) ËßéŠ Constructor ÍË ÝÎ韜‚—› ޟÁ ÎÁ Form .ŋÁ
.˜—˙› ŕ˂•…‹Á (Ý͕ Ţˌ ؖ߅› ݂˜œ ÍË) ÍՅœ› ˙‚thread


Form.java :´ ŋŸ™



˙ƒ‚ŸĂŸ ß asserts
ÎÁ Assert .Ý韂雜˙› ŕ•‚ŽÁ ŕ›‚œÍƒ ŕƒ ˙ƒ‚ŸĂŸ ß assert ś‹– ڟ ‚ž…œÁ ÍË
˙闟 .˜ߌ˙› ŕËŸË (6 ß 5 ˙‚Ĺ‹Ÿ™) Assert.java ÍË ŕ— Ëߌ˙› ܟ—Œ… К— ßË
ŕééé…ééé‹éééƒ ÍË ˙Íééé˜éééŸË ß ËÍÁË ÍÁÍééé– com.holub.tools ŕé…é‹éƒ ÍË
ŕé‡Áßé› Ü闌› ‚ƒ Assert ڟ ŕ—Ÿ›‚˜œ ŕ— ËÍÁË ÍÁ͖ com.holub.tools.debug
ÁÍ ÚŸ ͝ ˟œÁ߅˙› ͟ΠĹÁÍ߅‹Ë ÎÁ ˙—Ÿ ŢË͗ ŕ•‚ŽÁ ‚ƒ .ËË͘˙› ܂• ŹËߌ˙›
:˟œ— ŕ•‚ŽÁ Ëߊ ŕ›‚œÍƒ ŕƒ

import com.holub.tools.debug.Assert; //debug version
import com.holub.tools.Assert; //debug version


Üé— ÍË ÁÍ non-debugging ˙‚Ë…› HotSpot ˙΂‡› ޟŒ‚› ŕ— ËŸŒ‚ƒ ŕ…ŒÁË ŕ‡ß…
ß ŕé…é•Íé˜ Íé՜ ÍË ÁÍ ˙™‚Š ˙‚Ë…› HotSpot ˙œŸ .Ë΂‹˙› ŕœŸžƒ ‚ž‹š— ޟÁ
Ëé— ÎÁ ÁÍ ‚éžœÁ ŕ‡Ÿ…œ ÍË .˜ÍÁ˜ ˙ƒœ‚‡ ͟†‚… ȟ ‚žœÁ ˙‚žœ‚›ß˜ÍÁ ŕ—œŸÁ
.˜—˙› Ř̇ ˙Ÿ‚žœ


ľ ŋŸ™


ś ŋŸ™



ŕ‡Á͛ ¸ ß ˇ ˙‚Ĺ‹Ÿ™ ŕƒ) ˜͟˜˙› ĹÍߍ ٟÍÔ Ţ‚› ŕƒ ‚ž˜‚ƒ ‘•Í ß ˙ƒ‚ŸĂŸ
ŕéŠé‹éœ ŕé— ËéË˙› џ‚›œ ˙œ‚›ÎԖ• ÁÍ Ĺ͂ƒ D.ebug("Hello"); Íԋ .(˟œ—
.ˌ‚ƒ ŕˌ import ŕ›‚œÍƒ ŕƒ com.holub.tools.debug ˙œŸ debug

D.java :ˇ ŋŸ™

¸ ŋŸ™



.˟œ—˙› གŒ› š ŋŸ™ ÍË ŕ— Ĺ‹Á Std К— ś‹– ޟ͊Á

š ŋŸ™





á͟˜ ŕ‡Ÿ…œ

̄͟ ؂ԐœÁ ˙‚UI ˟œÁ߅˙› ŕ— ÝË Ţ‚Œœ ‚›Œ ŕƒ ÝŒ‚ƒ ŕ…‹œÁ߅ ŕ— ÝÍÁß˟›Á
get/set ‘éƒÁßé… ŕéƒ Î‚éŸéœ Ţß˃ ß ‚Ý…‹Ÿ‹ ͟Πޟƒ Coupling ܖÁˉ ‚ƒ ÁÍ
ß Ĺé•é ŕé— Đšé— Ţ韃 ˙ߖ coupling Ԗ• ˙‹—Á̈́ ÜÁßĎŸß á͂›› ÍË .˟΂‹ƒ
ÎÁ ËéŸéœÁßé…˙› Ϝ ‚‡œŸÁ ÍË ˙…‰ ‚›Á ËÍÁË Ëß‡ß ËË˙› ނŒœ ÁÍ Ëߊ ˙‹—Á̈́
.Ë韟‚›œ ŕ˂•…‹Á ŕ џ‚›œ ˙Á̓ JtextField ß Document ͟՜ ‘›‚‡ ˙‚Đš—
݋Í˙› model ß docupling Źview ˙œŸ MVC ˙™Á Ř˝ ŕƒ á͂›› ޟÁ ÍË ŕߚƒ
‚éÝÍé• .ËéŸŔ ŃéŸé„ ÜËé› ŕéƒ ÝŸ–…‹› ˙ƒ‚Ÿ…‹Ë ݂˜œ ÍË ˙…š—Œ› ŕ—œŸÁ Ţß˃
ŕ› ޟÁ ̓ ŕߚ .˜ƒ‚Ÿ ͟Ÿ“… ŹËœÍÁ̘ƒ ͟†‚… ܲ ̓ ŕ—œŸÁ Ţß˃ ˜œÁ߅˙›
˙ßé‡é…‹‡ ŕƒ Î‚Ÿœ ŕ—œŸÁ Ţß˃ Ëߌ˙› Η͛…› ܉› ڟ ÍË Ü˛ Éԋ К— ĹÁ͟Ÿ“…
.˜ŸŔ˙› ÍË ŃŸ‚›œ ŕƒ ŢŔ ÍË Đš— ł• ŕ— ËŒ‚ƒ ˙Ÿ‚žœ‚—›

Resources
The code in this article, along with an index of all the articles I've written for JavaWorld, can be found on my Web site, in the "Articles" section.
http://www.holub.com


Design patterns
Design Patterns: Elements of Reusable Object-Oriented Software, Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides (Addison-Wesley, 1995), is a cookbook documenting many patterns of object/class interaction that recur regularly in good object-oriented designs. All experienced object-oriented designers will recognize these patterns immediately from their own work, and folks who are learning object-oriented design can save themselves a lot of hard work by using the patterns described here from the beginning. Though any cookbook approach to design is ultimately limiting (to use a cookbook, you have to know how to cook), this book is invaluable to people learning the design process or wanting a common vocabulary to describe parts of their designs to other designers. It can save you an enormous amount of time:
http://www1.fatbrain.com/asp/bookinfo/bookinfo.asp?theisbn=0201633612&from=NCN454

Pattern Oriented Software Architecture: A System of Patterns, Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sommerlad, and Michael Stal (John Wiley & Sons, 1996 ) covers more or less the same ground as the Gang of Four book, but it covers some additional material as well. In particular, the Model/View/Controller and Presentation/Abstraction/Control architectures are discussed in depth:
http://www1.fatbrain.com/asp/bookinfo/bookinfo.asp?theisbn=0471958697&from=NCN454

Object-Oriented Programming: An Evolutionary Approach, 2nd ed., Brad Cox and Andrew J. Novobilski (Addison-Wesley, 1994). Brad Cox first came up with the notion of a "pluggable component" (which he calls a "Software IC") in the context of the Objective C programming language. This book discusses both the Software IC and the language:
http://www1.fatbrain.com/asp/bookinfo/bookinfo.asp?theisbn=0201548348&from=NCN454

Patterns in Java, Vol. 1, Mark Grand (John Wiley & Sons, 1998), is essentially a rehashing of the Gang of Four book, but much more readable, and with examples in Java rather than C++. Grand does cover several patterns not covered by the Gang of Four, too:

http://www1.fatbrain.com/asp/bookinfo/bookinfo.asp?theisbn=0471258393&from=NCN454

Patterns in Java, Vol. 2, Mark Grand (John Wiley & Sons, 1999), includes a very good chapter on UI design patterns, among others:
http://www1.fatbrain.com/asp/bookinfo/bookinfo.asp?theisbn=0471258415&from=NCN454


Reuse
"Flight 501 Failure Report," from the Inquiry Board of the European Space Agency, is an account of the launch and subsequent self destruction of the Ariane5 satellite booster. It's a great real-world example of why a "pluggable component" architecture is problematic in the real world:
http://www.esrin.esa.it/htdocs/tidc/Press/Press96/ariane5rep.html


UI design
Usability Engineering, Jakob Nielsen (Morgan Kaufmann Publishers, 1993), is a good introduction to writing programs with usability in mind:
http://www1.fatbrain.com/asp/bookinfo/bookinfo.asp?theisbn=0125184069&from=NCN454

The Design of Everyday Things, (Doubleday, 1990), Donald A. Norman, obstensibly is about industrial design, but is really about good design in general. Using what he calls "user-centered design," Norman describes in detail why some designs are so frustrating to users and others are not. Norman talks in depth about how to work with people to end up with good designs for everything from faucets to computer programs. It's an amusing book that gives great advice about a serious subject:
http://www1.fatbrain.com/asp/bookinfo/bookinfo.asp?theisbn=0385267746&from=NCN454

"Interface Hall of Shame," (Isys Information Architects), is a great compendium of bad UI design. There's also a good UI hall of fame, but the bad UI section is more amusing. Though Microsoft, as usual, provides a rich set of examples of how not to do things, they are by no means the only entrants:
http://www.iarchitect.com/mshame.htm

Designing Visual Interfaces: Communication Oriented Techniques, Kevin Mullett and Darrell Sano (Prentice Hall, 1995), is essential reading for designers of data-entry systems. Particularly useful discussions of dialog layout, data-entry forms, and so on:
http://www1.fatbrain.com/asp/bookinfo/bookinfo.asp?theisbn=0133033899&from=NCN454

The Visual Display of Quantitative Information, Edward R. Tufte (Graphics Press, 1983), is a beautiful book that describes the "other side" of the U/I equation: how to present data to the user in the clearest possible way. Mullett describes the input side of the equation, Tufte the output side. Tufte's other books ({i Visual Explanations} and {i Envisioning Information}) are also worthwhile.

About Face: The Essentials of User Interface Design, Alan Cooper (IDG Books, 1995). Ironically, the author of a great book about UI design is also the "father of Visual Basic," the tool responsible for many of the worst user interfaces ever foisted on the computing public. Cooper has a lot of opinions, some of which I agree with and some of which I don't. (In particular, I don't think of a program as a UI with intelligent warts hanging off of it, as Alan seems to do). Nonetheless, Cooper is always entertaining, and there's a lot of good advice here:
http://www1.fatbrain.com/asp/bookinfo/bookinfo.asp?theisbn=1568843224&from=NCN454


˙‡œ‹Í՜
ޟÁ ËÍߛ ÍË ÁÍ Ëߊ Í՜
:˟Ÿß˜ƒ ‚› ŕƒ Ă™Ô›

ŃÎÍÁ ‚ƒ ˙™ŸŠ -
ŃÎÍÁ ‚ƒ -
ŃÎÍÁ˙ƒ -

˙œ šßÔ ˙™ŸŠ -
˂œ› -
ŕ‚…ß— -

˙Š… ˙™ŸŠ -
Ăߙԛ -
ŋŸœ ˙Š… ˙•‚— ŕÎÁ˜Á ŕƒ -


:݂œ

:ڟœßͅ—™Á ŋ„

: ŗ͌ ݂œ

܃– ˙‚Ĺ›‹–
ÜßÁ ś‹– - Á͘˙Œ ˙‚Ý…‹Ÿ‹ ˙Á̓ ̓͂— ԃÁÍ ĹŠ‚‹
(ą ъƒ) ÝßË Ĺ›‹– - Á͘˙Œ ˙‚Ý…‹Ÿ‹ ˙Á̓ ̓͂— ԃÁÍ ĹŠ‚‹
(˛ ъƒ) ÝßË Ĺ›‹– - Á͘˙Œ ˙‚Ý…‹Ÿ‹ ˙Á̓ ̓͂— ԃÁÍ ĹŠ‚‹
(ł ъƒ) ÝßË Ĺ›‹– - Á͘˙Œ ˙‚Ý…‹Ÿ‹ ˙Á̓ ̓͂— ԃÁÍ ĹŠ‚‹


Copyright 2001-2002, IT World / Java World / PC WORLD Iran/ International Data Group Inc. All rights reserved.