IBM Korea Skip to main content
       IBM Ȩ    |  Á¦Ç° & ¼­ºñ½º  |  °í°´Áö¿ø & ´Ù¿î·Îµå  |  È¸¿ø°¡ÀÔ  

Áö´ÉÇü µ¥ÀÌÅÍ·Î SwingÀ» °£´ÜÈ÷!
º¹ÀâÇÑ GUI °³¹ßÀ» ½±°Ô Çϱâ À§ÇØ iData ±â¹ý »ç¿ëÇϱâ

Jonathan Simon
Ŭ¶óÀ̾ðÆ®Ãø ¼³°èÀÚ/Swing °³¹ßÀÚ, JPMorganChase and Entology, Inc.
2002³â 1¿ù

Swing ¾ÆÅ°ÅØó´Â ÀÚ¹Ù °³¹ßÀÚµé·Î ÇÏ¿©±Ý ¼ö¸¹Àº µ¥ÀÌÅ͸¦ Ç¥½ÃÇÏ´Â º¹ÀâÇÑ È­¸éÀ» ¸¸µé ¼ö ÀÖ°Ô ÇØÁØ´Ù. ºÒÇàÈ÷µµ ±× µ¥ÀÌÅ͸¦ ´ë±Ô¸ðÀÇ Swing ÄÄÆ÷³ÍÆ®¿¡ À¯ÁöÇÏ´Â °ÍÀº ¾Ç¸ùÀÇ ÄÚµùÀÌ µÉ ¼ö ÀÖ´Ù. ÀÌ ±Û¿¡¼­ Jonathan SimonÀº iData Áï intelligent data¶ó´Â ±â¹ýÀ» Á¦½ÃÇÑ´Ù. ¿©·¯ºÐÀº iData ¾ÆÅ°ÅØó¸¦ »ç¿ëÇؼ­ ¿©·¯ºÐ ¾ÖÇø®ÄÉÀÌ¼Ç ³»¿¡ Áß¾Ó µ¥ÀÌÅÍ ¸®ÆÄÁöÅ丮¸¦ ¸¸µé ¼ö ÀÖ´Ù. ±×·¸°Ô ÇÔÀ¸·Î½á ¿©·¯ºÐÀº µ¥ÀÌÅ͸¦ È­¸é¿¡¼­ º¸´Ù ¿ÏÀüÈ÷ ºÐ¸®ÇÒ °ÍÀÌ°í ´õ¿í ±ò²ûÇÏ°í À¯Áöº¸¼öÇϱ⠽¬¿î Äڵ带 ¸¸µé ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¿©·¯ºÐÀÇ ½ÃÀÛÀ» µµ¿Í ÁÖµµ·Ï ¿¹Á¦ Äڵ带 °®Ãá ¿ÀÇ ¼Ò½º ÅøŶµµ ³ª¿ÍÀÖ´Ù. ÀÌ ±ÛÀ» °è¼Ó ÀÐ¾î ³ª°¡¼­ iData ±â¹ý¿¡ ´ëÇØ ´õ ¸¹Àº °ÍÀ» ¾Ë°Ô µÇ°í »ùÇà ±¸Çöµµ º¸±â ¹Ù¶õ´Ù.

°í±Þ Swing ¾ÆÅ°ÅØó´Â °³¹ßÀÚ·Î ÇÏ¿©±Ý À¯·Ê¾øÀÌ º¹ÀâÇÑ È­¸éÀ» ¼³°èÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù. ±×·¯ÇÑ È­¸éÀº ¿¡·¯°¡ ³ª±â ½±°í À¯Áöº¸¼ö Çϱ⵵ Èûµç ¾öû³­ ¾çÀÇ ·ÎÁ÷À» ÇÊ¿ä·Î ÇÏ°ï ÇÑ´Ù. °í±Þ  Swing ÄÄÆ÷³ÍÆ® (¿¹¸¦ µé¸é, JTable°ú JTree °°Àº)¿¡¼­´Â Á» ´õ ±¤¹üÀ§ÇÑ Á¤º¸°¡ ÇÊ¿äÇÒ ¶§ ÇÁ·Î±×·¥ ·ÎÁ÷ÀÌ ¼¿À» ±âÃÊ·Î µ¥ÀÌÅ͸¦ º¸°ü, ÆíÁý, ·£´õ¸µÇÏ¿© Á¾Á¾ ¾î·Á¿î »óȲÀÌ ¹ß»ýÇÏ°ï ÇÑ´Ù. Áö´ÉÀû µ¥ÀÌÅÍ, Áï °í±Þ Á¤º¸¸¦ ´ãÀº µ¥ÀÌÅÍ´Â °í±Þ ¾ÖÇø®ÄÉÀ̼ÇÀ» °³¹ßÇϱâ À§ÇØ ÇÊ¿äÇÑ Áö½ÄÀ» Á¦°øÇÏ´Â ¼¿ µ¥ÀÌÅÍ¿Í ¸¶Âù°¡Áö·Î ÄÄÆ÷³ÍÆ® ¸ðµ¨¿¡ º¸°üµÉ ¼ö ÀÖ´Ù. ÀÌ ±Û¿¡¼­ ¼³¸íÇÏ´Â iData ±â¼úÀº Model-View-Controller ¾ÆÅ°ÅØó¸¦ À¯ÁöÇϸ鼭 Áö´ÉÇü µ¥ÀÌÅ͸¦ Swing ÄÄÆ÷³ÍÆ®¿Í ÅëÇÕÇϱâ À§ÇÑ Æ÷°ýÀûÀÎ ¾ÆÅ°ÅØó¸¦ ±¸ÃàÇÑ´Ù. ÀÌ´Â µ¥ÀÌÅÍ º¸°ü, µ¥ÀÌÅÍ Á¶È¸ °£Á¢ Á¢±Ù ¹× È­¸é ¼³Á¤ °£Á¢ Á¢±Ù¿¡ ´ëÇØ Áö´ÉÇü µ¥ÀÌÅ͸¦ »ç¿ëÇÏ´Â ¹ÐÁ¢ÇÏ°Ô ÅëÇÕµÈ °£Á¢ Á¢±ÙÇü ½ºÅ°¸¶¸¦ ÅëÇÏ¿© ÀÌ·ç¾îÁø´Ù. °á°ú·Î ³ª¿À´Â °£Á¢ Á¢±Ù °´Ã¼µéÀº º¹ÀâÇÑ ºñÁî´Ï½º È­¸é ·ÎÁ÷°ú º¹À⼺À» ÃÖ¼ÒÈ­ÇÑ »óÈ£ ÀÛ¿ë ±â´ÉÀ» ±¸ÇöÇϱâ À§ÇÑ À¯¿¬ÇÏ°í È®À强 ÀÖ´Â Áß¾Ó ÀúÀå¼Ò¸¦ ¸¸µé¾î³½´Ù.

ÀÚ½ÅÀÇ ÇÁ·ÎÁ§Æ®¿¡ iData ¾ÆÅ°ÅØó¸¦ ÅëÇÕÇÏ´Â °³¹ßÀÚµéÀ» µµ¿ÍÁÙ ¿ÀÇ ¼Ò½º iData ÅøŶÀÌ ³ª¿Í ÀÖ´Ù. ÀÌ ÅøŶÀº °£Á¢ Á¢±Ù ÃþÀ» Á¤ÀÇÇÏ´Â °¢Á¾ ÀÎÅ×ÆäÀ̽ºµéÀÇ ÁýÇÕ »Ó ¾Æ´Ï¶ó ±âº» ±¸Çö, ÃÖÀûÈ­, »ç¿ëÀÚ Á¤ÀÇ ÆíÁý±â¿Í º¯È¯±âµé, ±×¸®°í ¼ö ¸¹Àº ¿¹Á¦·Î ±¸¼ºµÇ¾îÀÖ´Ù. (Âü°íÀÚ·á).

iData ±â¹ýÀÇ ¼¼ °¡Áö Ãþ
iData ±â¹ýÀº ´ÙÀ½ ¼¼ °¡Áö ÃþÀ¸·Î ±¸¼ºµÇ¾î ÀÖ´Ù

  • µ¥ÀÌÅÍ º¸°ü: iData ±â¹ýÀº ¾ÖÇø®ÄÉÀ̼ÇÀÌ DataObjects¿¡ µ¥ÀÌÅ͸¦ º¸°üÇÑ´Ù°í °¡Á¤ÇÑ´Ù. DataObject´Â »óÀÀÇÏ´Â get[FieldName]()°ú set[FieldName]() ¸Þ¼Òµå¸¦ °¡Áø ¼ö¸¹Àº Çʵ带 Æ÷ÇÔÇÏ°í ÀÖ´Â ÀÚ¹Ùºó ¹æ½ÄÀÇ °´Ã¼·Î ´À½¼ÇÏ°Ô Á¤ÀǵȴÙ.
  • ÄÄÆ÷³ÍÆ®¸¦ Ç¥½ÃÇÏ´Â µ¥ÀÌÅÍ °ª °£Á¢ Á¢±Ù: µ¥ÀÌÅÍ °£Á¢ Á¢±Ù ÃþÀº DataObject¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Â °´Ã¼¸¦ Á¤ÀÇÇÏ´Â ÀÎÅÍÆäÀ̽º·Î ±¸¼ºµÇ¾î ÀÖ´Ù. ÀÌ°ÍÀº Áö´ÉÇü µ¥ÀÌÅÍ,Áï iData ÃþÀ¸·Îµµ ¾Ë·ÁÁ® ÀÖ´Ù (iData ÃþÀÌ ÀüüÀûÀÎ ¾ÆÅ°ÅØÃÄÀÇ ¸íĪÀÎ iData ±â¹ý°ú È¥µ¿µÇ¾î¼­´Â ¾ÈµÈ´Ù). iData ÃþÀÇ ÀÎÅÍÆäÀ̽ºµéÀº DataObject ³»ÀÇ Çʵ忡 Á¢±ÙÇÏ°í º¯°æÇϱâ À§ÇÑ ÀϹÝÀûÀÎ ¸Þ¼Òµå¸¦ Á¤ÀÇÇÑ´Ù. °¢°¢ÀÇ ±¸Ã¼ÀûÀÎ iData Ãþ Ŭ·¡½º´Â ƯÁ¤ ¿ä±¸»çÇ׿¡ ´ëÇØ ÀÌ ÀϹÝÀûÀÎ Á¢±ÙÀÚ¿Í º¯È¯ÀÚ ¸Þ¼Òµå¸¦ ±¸ÇöÇÑ´Ù. º¸Åë iData ÃþÀÇ ±¸ÇöÀº DataObject¿¡¼­ °ªÀ» ¾ò°í ¼³Á¤ÇÑ´Ù. ±×·¯³ª ¿¹¿¡¼­µµ º¸°ÚÁö¸¸ ÀÌ·¯ÇÑ °£Á¢ Á¢±ÙÀº ÆíÁý °ËÁõ, °¡»ó µ¥ÀÌÅÍ ¹× µ¥ÀÌÅÍ Àå½Ä µîÀ» Æ÷ÇÔÇÑ º¹ÀâÇÑ ·ÎÁ÷µéÀ» ±¸ÇöÇϱâ À§ÇÑ Áß¾ÓÀÇ º¸°ü¼Ò¸¦ ¸¸µç´Ù. iData ·¹º§Àº º¯°æ ºÒ°¡´ÉÇÑ (Àбâ Àü¿ë) µ¥ÀÌÅÍ¿Í º¯°æ °¡´ÉÇÑ(Àбâ/¾²±â) µ¥ÀÌÅ͸¦ À§ÇÑ ±â´ÉÀ¸·Î ´õ ³ª´©¾îÁø´Ù. ÀÌ·¯ÇÑ ±¸ºÐÀº ÆíÁý ·ÎÁ÷ÀÌ ÇÊ¿ä ¾ø´Â º¹ÀâÇÑ ºñÆíÁý µ¥ÀÌÅÍ¿ÍÀÇ ÀÎÅÍÆäÀ̽º¸¦ °£´ÜÇÏ°Ô Çϱâ À§ÇØ ¸¸µé¾îÁ³´Ù.
  • µ¥ÀÌÅÍ¿¡ ±â¹ÝÇÏ¿© ÆíÁý°ú ·£´õ¸µ ÄÄÆ÷³ÍÆ®¸¦ Ä¿½ºÅ͸¶ÀÌ¡ÇÏ´Â È­¸é °£Á¢ Á¢±Ù: Áö´ÉÇü È­¸é, Áï iDisplay ÃþÀº iData Ãþ°ú ¸¶Âù°¡Áö·Î °£Á¢ Á¢±Ù ¹æ½ÄÀ» ÀÌ¿ëÇÏ¿© Áö´ÉÇü È­¸éÀ» ±¸ÇöÇÑ´Ù. iDisplay ÃþÀº iData ÃþÀÇ °´Ã¼µéÀ» ÆíÁýÇÏ°í ·£´õ¸µÇÏ´Â ÄÄÆ÷³ÍÆ®¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇÑ´Ù. ÀÌ·¯ÇÑ iDisplay Ãþ Ä¿½ºÅ͸¶ÀÌÁ¦À̼ÇÀÇ ¿¹¿¡´Â ¼¿ÀÇ ¹è°æ »öÀ» ¹Ù²Ù¾î ¿¡·¯ »óȲÀ» Ç¥½ÃÇÏ´Â °Í°ú iDataÃþÀÇ ±¸Çö ³»¿ëÀÌ ÀÚ½ÅÀÇ µ¥ÀÌÅ͸¦ ÆíÁýÇϱ⿡ °¡Àå ÀûÇÕÇÑ ÄÄÆ÷³ÍÆ®¸¦ °áÁ¤ÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â ÀϹÝÀûÀÎ ÆíÁý±â¸¦ ¸¸µå´Â °Í µîÀ» µé ¼ö ÀÖ´Ù. iDataÃþ°ú ¸¶Âù°¡Áö·Î iDisplay Ãþµµ º¯°æ ºÒ°¡´ÉÇÑ µ¥ÀÌÅÍ¿Í º¯°æ °¡´ÉÇÑ µ¥ÀÌÅ͸¦ À§ÇÑ ±â´ÉÀ¸·Î ³ª´©¾îÁø´Ù.

ÀÌ ¼¼ °¡Áö ÃþÀº ¼­·Î °áÇÕÇÏ¿© µ¥ÀÌÅÍ ÀÚü°¡ ¾Æ´Ñ ÄÄÆ÷³ÍÆ® ¸ðµ¨¿¡ µ¡ºÙ¿©Áö´Â ¹ÐÁ¢ÇÏ°Ô ÅëÇÕµÈ °£Á¢ Á¢±Ù °´Ã¼ ¼¼Æ®¸¦ ¸¸µç´Ù. ÀÌ ¾ÆÅ°ÅØó´Â Swing¿¡¼­ Model-View-Controller ¾ÆÅ°ÅØÃĸ¦ À¯ÁöÇÏ´Â ÇÑÆí ¼¿ ±â¹ÝÀÇ ±â¼úÀ» °¡´ÉÇÏ°Ô ÇÑ´Ù. µ¥ÀÌÅ͸¦ Á¶È¸, Ç¥½Ã, ÆíÁýÇÏ´Â ·ÎÁ÷Àº °¢ ¼¿ ¾È¿¡ ÀÖ´Â Áö´ÉÇü µ¥ÀÌÅÍ °´Ã¼ ³»¿¡ ĸ½¶È­µÈ´Ù. ±× °á°ú º¹ÀâÇÑ »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º Ç¥½Ã¿Í »óÈ£ÀÛ¿ëÀ» ±¸ÇöÇϱâ À§ÇÑ ±â´ÉÀûÀ¸·Î À¯¿¬ÇÏ°í È®À强 ÀÖ´Â ±â¹ýÀÌ ¸¸µé¾îÁø´Ù.

±×¸² 1. iData ±â¹ýÀÇ Àüü ¾ÆÅ°ÅØó Ŭ·¡½º µµÇ¥
Class diagram of the complete architecture for the iData technique

´ÙÀ½ ¼½¼Çµé¿¡¼­´Â iData ±â¹ý¿¡ ´ëÇÑ ¾ÆÅ°ÅØóÀÇ °¢ ÃþÀ» »ìÆ캼 °ÍÀÌ´Ù. ¿ì¸®´Â ÀÌ ±â¼úÀ» º¸¿© ÁÖ±â À§ÇØ °¡»óÀÇ ÀÚÀü°Å »óÁ¡ ¾ÖÇø®ÄÉÀ̼ÇÀÇ ºÎºÐµéÀ» ¸¸µé¾î °¥ °ÍÀÌ´Ù.

DataObjects
À§¿¡¼­ ¾ð±ÞÇßµíÀÌ, DataObject´Â »óÀÀÇÏ´Â get[FieldName]()°ú set[FieldName]() ¸Þ¼Òµå¸¦ °¡Áø ¼ö¸¹Àº ÇʵåµéÀ» Æ÷ÇÔÇÏ´Â ÀÚ¹Ùºó ¹æ½Ä °´Ã¼·Î Á¤ÀǵȴÙ. µ¥ÀÌÅÍ ÇʵåµéÀº º¸Åë ºñÁî´Ï½º ¿µ¿ª¿¡ µû¶ó DataObject ³»¿¡¼­ °áÇյȴÙ. ¿ì¸®ÀÇ ¿¹ÀÎ ÀÚÀü°Å »óÁ¡ ¾ÖÇø®ÄÉÀ̼ÇÀº ¿©·¯ Çʵåµé (modelName, manufacturer, price, cost µî)°ú »óÀÀÇÏ´Â get/set ¸Þ¼Òµå¸¦ °¡Áø BicycleÀ̶ó´Â DataObject¸¦ °¡Áö°í ÀÖ´Ù. ÀÚÀü°Å »óÁ¡¿¡¼­ÀÇ ¶Ç ´Ù¸¥ ÀáÀçÀûÀÎ DataObject·Î´Â Bicycle°ú À¯»çÇÑ Çʵ带 °¡Áø BicycleComponen¿Í purchasorName, price, dataOfPurchaseµîÀÇ Çʵ带 °¡Áø Purchase DataObject¸¦ µé ¼ö ÀÖ´Ù. ´ÙÀ½Àº ÀÚÀü°Å »óÁ¡ ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ Bicycle DataObjectÀÇ ÀϺθ¦ º¸¿©ÁÖ´Â ¿¹ÀÌ´Ù.

Listing 1. »ùÇÃ DataObject


public class Bicycle
{
     //fields
     double price = ...
     String manufacturer = ...
     ...


     //default constructor
     public Bicycle(){}



     //accessors
     public Double getPrice()
     {
          //sometimes its necessary to wrap primitives in related 
          //Object types...
          return new Double(this.price);
     }

     public String getManufacturer()
     {
          return this.manufacturer;
     }


     ...


     //mutators
     public void setPrice(Double price)
     {
          this.price = price.doubleValue();
     }

     public void setManufacturer(String manufacturer)
     {
          this.manufacturer = manufacturer;
     }

     ...

}     

°£Á¢ Á¢±Ù: iData Ãþ


À§¿¡¼­ ¾ð±ÞÇßµíÀÌ, iDataÃþÀº º¯°æ ºÒ°¡´ÉÇÑ µ¥ÀÌÅÍ¿Í º¯°æ °¡´ÉÇÑ µ¥ÀÌÅ͸¦ À§ÇÑ ±â´ÉÀ¸·Î ³ª´©¾îÁø´Ù. MutableData ÀÎÅÍÆäÀ̽º´Â ImmutableData ÀÎÅÍÆäÀ̽º¸¦ È®ÀåÇϱ⠶§¹®¿¡, ¿ì¸®´Â º¯°æ ºÒ°¡´ÉÇÑ ±â´ÉÀ» ¸ÕÀú °ËÅäÇÏ°Ú´Ù.

Àбâ Àü¿ëÀÇ Áö´ÉÇü µ¥ÀÌÅÍ (ImmutableIData)¸¦ À§ÇÑ µ¥ÀÌÅÍ °£Á¢ Á¢±ÙÃþ

ImmutableData ÀÎÅÍÆäÀ̽º´Â iDataÃþÀÇ ÀϺκÐÀÌ´Ù; ÀÌ°ÍÀº º¯°æ ºÒ°¡´ÉÇÑ iData °£Á¢ Á¢±ÙÀ» ³ªÅ¸³»¸ç, µÎ °¡Áö ¸Þ¼Òµå¿Í ÇϳªÀÇ ±ÇÀåµÇ´Â ¸Þ¼Òµå ¿À¹ö¶óÀ̵ùÀ¸·Î ±¸¼ºµÈ´Ù:

  • getData()´Â DataObject·ÎºÎÅÍ Á¤ÀÇµÈ À¯ÇüÀÇ µ¥ÀÌÅÍ °ªÀ» ¹ÝȯÇÑ´Ù.
  • getSouce()´Â DataObject ÀÚ½ÅÀ» ¹ÝȯÇÑ´Ù.
  • toString() ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵ùÇϸé getData()ÀÇ °á°ú¸¦ Ç¥½ÃÇÏ´Â stringÀ» ¹ÝȯÇÑ´Ù.

Manufacturer Çʵ带 À§ÇÑ ImmutableData ±¸Çö ³»¿ëÀ» ¿¹·Î »ìÆ캸ÀÚ.

Listing 2. ÀÚÀü°Å Á¦Á¶¾÷ÀÚ¸¦ À§ÇÑ ImmutableIData ±¸Çö



public class BicycleManufacturerIData implements ImmutableIData
{
  //the DataObject
  Bicycle bicycle = null;

  public BicycleManufacturerIData(Bicycle bicycle)
  {
    this.bicycle = bicycle;  //cache the DataObject 
  }

  public Object getSource()
  {
    return this.bicycle; //this simply returns the DataObject
  }

  public Object getData()
  {
    //returns the manufacturer field from the DataObject.  
    //This is the main logical method of the indirection layer.
    return bicycle.getManufacturer(); 
  }

  public String toString()
  {
    //create a safe to String method to avoid null pointer exceptions 
    //while painting...
    Object data = this.getData();
    if (data != null)     
      return data.toString();
    else
      return "";
  }
}

iData ÅøŶÀº DefaultImmutableData¶ó´Â ImmutableData¸¦ ±¸ÇöÇÏ´Â Ãß»ó Ŭ·¡½º¸¦ Á¦°øÇÑ´Ù. ÀÌ°ÍÀº getData()¸¦ ¾ÈÀüÇÏ°Ô ¹ÝȯÇϱâ À§ÇØ ObjectÀÇ toString() ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵åÇÑ´Ù. ¿ì¸®ÀÇ ³ª¸ÓÁö ¿¹µéÀº iData Ãþ ÀÎÅÍÆäÀ̽ºµéÀÇ ±âº» ±¸Çö ³»¿ëÀ» È®ÀåÇÏ°Ô µÉ °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ±âº» ±¸Çö ³»¿ëµéÀº ÅøŶ¿¡µµ Æ÷ÇԵǾîÀÖ´Ù.

JTable°úÀÇ ÅëÇÕ
°è¼ÓÇؼ­ ¿ì¸®ÀÇ ÀÚÀü°Å »óÁ¡ ¿¹Á¦¸¦ °¡Áö°í iData ±â¼úÀ» JTable¿¡ °áÇÕ½ÃÄѺ¸ÀÚ. Å×À̺íÀº manufacturer, modelName, modelID, price, cost ¹×inventory¿¡ ÇØ´çÇÏ´Â ¿­À» °¡Áö°í ÀÖ´Ù. ImmutableIData ±¸ÇöÀÇ ³ª¸ÓÁö°¡ manufacturer iDataÀÇ Äڵ带 µû¶ó ÀÛ¼ºµÇ¾ú´Ù°í °¡Á¤ÇÏÀÚ.

JTable DataModel¿¡ ½ÇÁ¦·Î Ãß°¡µÈ µ¥ÀÌÅ͵éÀº °¢°¢ ÇϳªÀÇ DataObject¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Â ImmutableIDataÀÇ ±¸Çö ³»¿ëµéÀÌ´Ù. ÇϳªÀÇ DataObject¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Â iData ÃþÀÇ ±¸ÇöÀ» Ãß°¡ÇÑ´Ù¶ó´Â °³³äÀº ¾Õ¿¡¼­ ¾ð±ÞÇß´ø °£Á¢ Á¢±Ù ÃþÀ» ½ÇÇöÇÑ °ÍÀÌ´Ù. .

±×¸² 2. DataObjectµéÀ» ´ã°íÀÖ´Â ImmutableIData ±¸Çö ³»¿ë°ú JTable ¼¿
JTable cells with ImmutableIData implementations containing DataObjects

³ª´Â Çѹø¿¡ ÇÑ Çà Àüü¸¦ ¸¸µé¾î ³»´Âµ¥ createRow()¶ó´Â ÇïÆÛ ¸Þ¼Òµå°¡ À¯¿ëÇÏ´Ù´Â °ÍÀ» ¾Ë¾Ò´Ù. AbstractTableModelÀÇ ¼­ºêŬ·¡½º¸¦ »ç¿ëÇÒ ¶§ ÀÌ Çà Àüü°¡ ¸ðµ¨¿¡ Ãß°¡µÉ ¼ö ÀÖ´Ù. createRow() ¸Þ¼Òµå´Â DataObject¸¦ ¸Å°³º¯¼ö·Î ÃëÇÏ°í ƯÁ¤ Å×ÀÌºí¿¡ ´ëÇØ ÀûÀýÇÑ ImmutableIData ±¸ÇöÀ» ÀνºÅϽºÈ­ÇÑ´Ù.

Listing 3. createRow() ¸Þ¼Òµå


protected Vector createRow(Bicycle bicycle)
  {
    Vector vec = new Vector();
      vec.add(new BicycleModelNameImmutableIData(bicycle));
      vec.add(new BicycleModelIDImmutableIData(bicycle));
      vec.add(new BicycleManufacturerImmutableIData(bicycle));
      vec.add(new BicyclePriceAndCostImmutableIData(bicycle));
      vec.add(new BicycleProfitImmutableIData(bicycle));
      vec.add(new BicycleInventoryImmutableIData(bicycle));
    return vec;
  }

Ãß°¡ÀûÀ¸·Î, createRow()¸Þ¼Òµå´Â ¾î¶² ImmutableIData ±¸Çö ³»¿ëÀ» ¸ðµ¨¿¡ µÎ¾î¾ß ÇÏ´ÂÁö¸¦ ÆǺ°ÇÏ´Â ·ÎÁ÷À» À§ÇÑ Áß¾ÓÀÇ ÀúÀå¼ÒÀÌ´Ù. ÀÌ°ÍÀº ¶ÇÇÑ °£´ÜÇÑ ImmutableIData ±¸ÇöÀ» À§ÇØ createRow() ¸Þ¼Òµå ³»¿¡ Á÷Á¢ ¼±¾ðµÈ À͸íÀÇ ÀÌ³Ê Å¬·¡½ºµéÀ» »ç¿ëÇϱâ À§ÇÑ Å¬·¡½º °ü¸®ÀÇ Ãø¸é¿¡¼­µµ À¯¿ëÇÏ´Ù.

·£´õ¸µ ¼ø¼­
±âº» rendererµéÀº °´Ã¼ÀÇ toString() ¸Þ¼Òµå¸¦ È£ÃâÇÔÀ¸·Î½á ±×µéÀÌ Ç¥½ÃÇÒ °´Ã¼ÀÇ ¹®ÀÚ¿­ Ç¥ÇöÀ» ¸¸µç´Ù. ÀÌ°ÍÀº ImmutableIData ±¸Çö ³»¿ëÀÌ À¯¿ëÇÑ toString() ¸Þ¼Òµå¸¦ °¡Áö´Â °ÍÀÌ Áß¿äÇÑ ÀÌÀ¯ Áß ÇϳªÀÌ´Ù. ·£´õ¸µ ½Ã¿¡ renderer´Â JTable·ÎºÎÅÍ ImmutableIData ±¸Çö ³»¿ëÀ» ¹Þ´Â´Ù. iData¸¦ ·£´õ¸µÇϱâ À§ÇØ toString() ¸Þ¼Òµå°¡ È£ÃâµÇ¾îÁø´Ù. ´ÙÀ½Àº Àüü ·£´õ¸µ ¼ø¼­ÀÌ´Ù.

  • iData ±¸Çö»óÀÇ toString()
  • iData ±¸Çö»óÀÇ getData()
  • DataObject»óÀÇ get[FieldName]()

±×¸² 3. ·£´õ¸µ ¼ø¼­
Rendering sequence

±×¸² 4. Àбâ Àü¿ë Å×À̺í
Read-only table

µ¿Àû ¿µ¼Ó¼º
iDataÀÇ µ¥ÀÌÅÍ·Î DataObjects¸¦ »ç¿ëÇϸé iData °£Á¢ Á¢±Ù¿¡ ´ëÇÑ À¯¿¬¼ºÀ» Á¦°øÇÒ »Ó¸¸ ¾Æ´Ï¶ó µ¿ÀûÀÎ ¿µ¼Ó¼ºÀ» Á¦°øÇÏ´Â À¯¿ëÇÑ µ¥ÀÌÅÍ °£Á¢ Á¢±Ù ÃþÀ» Ãß°¡Çϱ⵵ ÇÑ´Ù. °ªÀÌ ¿ÜºÎ¿¡¼­ ¼öÁ¤µÇ´Â Å×À̺íÀÇ ¿¹¸¦ »ý°¢ÇØ º¸ÀÚ. º¸Åë, Ŭ¶óÀ̾ðÆ®´Â ¼öÁ¤µÈ °ªÀ» º¸Á¸ÇÒ ¸ðµ¨ ³»ÀÇ À§Ä¡¸¦ ÃßÁ¤Çϱâ À§ÇØ º¹ÀâÇÑ ·ÎÁ÷À» ±¸ÇöÇØ¾ß ÇÒ °ÍÀÌ´Ù. iData¿Í DataObject °£Á¢ Á¢±ÙÀ» »ç¿ëÇÏ¸é »õ·Î¿î °ªµéÀÌ ÀÚµ¿À¸·Î º¸°üµÇ±â ¶§¹®¿¡ ÀÌ ·ÎÁ÷Àº ¿ÏÀüÈ÷ ºÒÇÊ¿äÇÏ°Ô µÈ´Ù. ÀÌ´Â µ¿ÀÏÇÑ DataObject ÀνºÅϽº¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Â ¿©·¯ °³ÀÇ iData °´Ã¼·Î ¸ðµ¨À» ±¸¼ºÇÑ °á°úÀÌ´Ù. ÇÑ DataObjectÀÇ ³»ºÎ °ªÀÌ º¯°æµÉ ¶§ DataObject ÀÚ½ÅÀº º¯°æµÇÁö ¾ÊÀº ä·Î ÀÖ´Ù. ¿Ö³ÄÇÏ¸é ¸ðµç iData °´Ã¼µéÀº µ¿ÀÏÇÑ ÀνºÅϽº¸¦ °¡¸®Å°±â ¶§¹®ÀÌ´Ù. get °ú set ¸Þ¼Òµå¸¦ »ç¿ëÇÏ¿© DataObject¸¦ ´Ù½Ã Á¶È¸ÇÏ¸é ¾î¶² ¼öµ¿ÀûÀÎ º¸°ü ¹æ¹ý ¾øÀ̵µ Ç×»ó ÃÖ½ÅÀÇ °á°ú¸¦ ¹ÝȯÇÑ´Ù. ¼öÁ¤½Ã¿¡ Ŭ¶óÀ̾ðÆ®°¡ ¹Ýµå½Ã ¼öÇàÇØ¾ß ÇÏ´Â À¯ÀÏÇÑ ÇàÀ§´Â ´Ù½Ã Ç¥½ÃÇÏ´Â °ÍÀε¥, ±×·¯¸é renderer°¡ ¼öÁ¤µÈ ¼¿À» ´Ù½Ã ·£´õ¸µÇÏ¿© Â÷·Ê·Î »õ·Î¿î µ¥ÀÌÅÍ °ªÀ» Á¶È¸ÇÏ°í Ç¥½ÃÇÑ´Ù.

ÀÌ·¯ÇÑ °£Á¢ Á¢±ÙÀÇ ÇÑ °á°ú´Â ÅëÀÏµÈ Å¬¶óÀ̾ðÆ® µ¥ÀÌÅÍ Ä³½¬¸¦ °¡Áú ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ÄÄÆ÷³ÍÆ®µéÀÌ Áß¾ÓÀÇ Å¬¶óÀ̾ðÆ® ij½¬·ÎºÎÅÍ iData °£Á¢ Á¢±Ù°ú DataObjects¸¦ »ç¿ëÇÑ´Ù°í °¡Á¤Çϸé, ¸ðµç µ¥ÀÌÅÍ ¼öÁ¤ ³»¿ëÀº ¾ÖÇø®ÄÉÀÌ¼Ç Àüü¿¡ µ¿ÀûÀ¸·Î º¸°üµÈ´Ù. ÀÌ°ÍÀº °Å·¡¿ë ½Ã½ºÅÛ°ú µ¿Àû µ¥ÀÌÅ͸¦ Ç¥½ÃÇØ¾ß ÇÏ´Â ¿©Å¸ÀÇ Å¬¶óÀ̾ðÆ®µéÀ» »ó´çÈ÷ ´Ü¼øÈ­½Ãų ¼ö ÀÖ´Ù.

¿¹: °¡»ó ¿­ (virtual columns)
iData ±â¹ýÀÇ À¯¿¬¼ºÀ» º¸¿©ÁÖ´Â ÇÑ ¿¹°¡ °¡»ó ¿­ÀÌ´Ù. °¡»ó ¿­Àº ¸ðµ¨¿¡¼­´Â ¸í½ÃÀûÀ¸·Î µå·¯³ªÁö ¾Ê°í ¿ÀÈ÷·Á ¿©·¯ ÇʵåµéÀ» ÇÕ¼ºÇÑ °ÍÀ̶ó ÇÒ ¼ö ÀÖ´Â µ¥ÀÌÅ͸¦ º¸°üÇÏ´Â ¿­À» ¸»ÇÑ´Ù. price¿Í cost°£ÀÇ Â÷À̸¦ Ç¥ÇöÇÏ´Â profitÀ̶ó´Â ¿­À» °¡Á¤Çغ¸ÀÚ. ±×·¯ÇÑ ¿­À» ¸¸µé±â À§Çؼ­´Â getData()°¡ price¿Í cost °£ÀÇ Â÷¾×À» ¹ÝȯÇÏ´Â ImmutableIData ±¸ÇöÀ» ÀÛ¼ºÇÏ¸é µÈ´Ù.

Listing 4. ¼øÀÍ °¡»ó ¿­


public class BicycleProfitImmutableIData extends DefaultImmutableIData
{
  ...
  
  public Object getData()
  {
    //return the difference of the price and cost field from the DataObject
    return new Double(bicycle.getPrice() - bicycle.getCost());
  }
}

Ç¥ÁØ ¸ðµ¨·Î ÀÌ·¯ÇÑ À¯ÇüÀÇ °¡»ó ÇàÀ» ¸¸µé¾î ³»·Á¸é »ó´çÇÑ ¾çÀÇ ·ÎÁ÷ÀÌ ÇÊ¿äÇÒ °ÍÀÌ´Ù. óÀ½¿¡´Â ¸ðµ¨ÀÌ Á¤È®ÇÑ °ªÀ» ¹ÞÀ» °ÍÀÌ´Ù. ±×·¯³ª price ȤÀº cost°¡ ¼öÁ¤µÇ¾úÀ» ¶§ ¾ÖÇø®ÄÉÀÌ¼Ç Àüü¿¡ profit °ªÀ» ¼öÁ¤Çϱâ À§ÇØ º¹ÀâÇÏ°í ¿¡·¯ ³ª±â ½¬¿î ·ÎÁ÷ÀÌ ÇÊ¿äÇØÁö¸é¼­ ¹®Á¦°¡ ¹ß»ýÇÑ´Ù. iData ±â¹ý¿¡¼­´Â price³ª cost°¡ º¯ÇÏ´õ¶óµµ ¼öÁ¤ÀÌ ÇÊ¿äÇÏÁö ¾Ê´Ù. ¿µ¼Ó¼ºÀÌ µ¿ÀûÀ¸·Î ÀÌ·ç¾îÁø´Ù.

±¸¼º¿ä¼Ò·Î iData °´Ã¼ »ç¿ëÇϱâ
°£Á¢ Á¢±Ù ÃþÀº iData °´Ã¼ÀÇ ±×·ìÀ¸·Î ±¸ÇöµÇ¾î »ó´çÇÑ ÀÌÁ¡À» Á¦°øÇÑ´Ù. ¿¹¸¦ µé¾î, µÎ °¡Áö µ¥ÀÌÅÍ °ªÀ» ´õÇÏ´Â PirceAndCost Ç¥ÇöÀº ¶ÇÇÑ Á¶ÇÕÀ» »ç¿ëÇؼ­ ±¸ÇöµÉ ¼öµµ ÀÖ´Ù. »õ·Î¿î CompositePriceAndCost Ç¥Çö¿¡¼­ DataObject·ÎºÎÅÍ Á÷Á¢ ¾çÂÊÀÇ µ¥ÀÌÅÍ °ªµéÀ» Á¶È¸ÇÏ´Â ´ë½Å, ¿ì¸®´Â ¾Õ¼­ ÀÛ¼ºÇÑ BicyclePriceImmutableIData¿Í BicycleCostImmutableIData °´Ã¼¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. getData() ¸Þ¼Òµå´Â ±¸ºÐÀÚ -ÀÌ °æ¿ì¿¡´Â »ç¼± (/)- ¿¡ ÀÇÇØ Ç¥½ÃµÈ µÎ iData Ãþ ±¸Çöµé·ÎºÎÅÍ Á¶È¸µÈ °ªµéÀ» ÷°¡ÇÔÀ¸·Î½á ¹Ýȯ ¹®ÀÚ¿­À» ¸¸µé¾î³½´Ù. °á°ú·Î ³ª¿À´Â getData() ¸Þ¼Òµå´Â ´ÙÀ½°ú °°´Ù.

Listing 5. PriceAndCostImmutableIDataÀÇ Á¶ÇÕ ±¸Çö


public Object getData()
{
    // append the price, a slash, and the cost using pre-built iData 
    // implementations     
    return new String( (String)priceIData.getData() + " / " + 
        (String)costIData.getData() );  
}

¼­·Î ´Ù¸¥ iData ±¸Çö ³»¿ëÀ» °áÇÕÇÏ´Â ±â¼úÀº ÄÚµå Àç»ç¿ë°ú À¯¿¬¼ºÀ» Çâ»ó½ÃŲ´Ù. ¿©·¯ºÐÀº ±âÁ¸ÀÇ iData ±¸ÇöµéÀ» ´Ù¸£°Ô Á¶ÇÕÇÏ¿© »õ·Î¿î iData ±¸ÇöÀÇ °³¹ßÀ» ½ÃÀÛÇÒ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ Á¶ÇÕÀº ·±Å¸Àӽÿ¡ iData ±¸Çö ³»¿ëÀÌ µ¿ÀûÀ¸·Î Á¶ÇյǴ °ÍÀ» ¿ëÀÌÇÏ°Ô Çϱ⠶§¹®¿¡ À¯¿¬¼ºÀÌ ³ô¾ÆÁú »Ó ¾Æ´Ï¶ó ±¸Ã¼ÀûÀΠŬ·¡½º°¡ Àû¾îÁø´Ù. ÅøŶ¿¡´Â °£´ÜÇÑ Á¶ÇÕ ±â¹ÝÀÇ iData °´Ã¼¸¦ ±¸ÇöÇϱâ À§ÇÑ ´Ù¼öÀÇ ÇïÆÛ Å¬·¡½º°¡ µé¾î Àִµ¥, ¿©±â¿¡´Â iDataÀÇ ¹®ÀÚ¿­ Ç¥ÇöÀ» Àå½ÄÇϱâ À§ÇØ Á¢¹Ì»ç¿Í (ȤÀº) Á¢µÎ»ç¸¦ °¡Áø ÀÓÀÇÀûÀÎ iData °´Ã¼¸¦ ÃëÇÏ´Â prefix and suffix string decorator iData ±¸ÇöÀÌ Æ÷ÇԵȴÙ.

reflection ±â¹ÝÀÇ ImmutableIData ±¸Çö (UniversalImmutableIData)
iData ¹æ½ÄÀÇ ÃÖ´ë ´ÜÁ¡Àº Ŭ·¡½º ±ÞÁõÀÌ´Ù. iData Ŭ·¡½ºÀÇ ¼ö´Â ´ë´ÜÀ§ ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ ºü¸£°Ô ºÒ¾î³¯ ¼ö ÀÖ´Ù. iData Ãþ ±¸ÇöÀÇ ´ë´Ù¼ö´Â °°Àº ¼ø¼­¸¦ ¹Ýº¹Çϴµ¥, ¿©±â¿¡¼­ getData() ¿äûÀº DataObject ³»ÀÇ get[FieldName]() ¸Þ¼Òµå·Î ³Ñ°ÜÁø´Ù. ÀÌ°ÍÀº ÀϹÝÀûÀ¸·Î refectionÀ» ÀÌ¿ëÇÏ¿© ±¸ÇöµÈ´Ù. ÅøŶ¿¡´Â UniversalImmutableData¶ó´Â reflection ±â¹ÝÀÇ ImmutableIData ±¸Çö ³»¿ëÀÇ ±âº» ±¸ÇöÀÌ µé¾î ÀÖ´Ù. UniversalImmutableData´Â ÃʱâÀÇ ¸Å°³º¯¼ö·Î ÇÑ DataObject¿Í Çʵå À̸§À» ÃëÇÑ´Ù. ³»ºÎÀûÀ¸·Î UniversalImmutableData´Â Çʵå À̸§À¸·Î get[[FieldName]() ¸Þ¼Òµå¸¦ Á¶È¸Çϴµ¥, ÀÌ ¸Þ¼Òµå´Â getData()³ª toString() ¸Þ¼Òµå°¡ ºÒ¸®¿öÁú ¶§ È£ÃâµÈ´Ù. ÀÌ·± ¹æ½ÄÀº reflectionÀÇ »ç¿ëÀ¸·Î ÀÎÇÑ ¾à°£ÀÇ ¼º´É ÀúÇϸ¦ °¡Á®¿À´Â ´ë½Å °³¹ßÀ» ´Ü¼øÈ­ÇÏ°í Ŭ·¡½º ±ÞÁõÀ» ÁÙÀδÙ. ´ëºÎºÐÀÇ ¾ÖÇø®ÄÉÀ̼ǵéÀº ÀÌ·¯ÇÑ ¼º´É ÀúÇÏÀÇ ¿µÇâÀ» ¹ÞÁö ¾Ê°ÚÁö¸¸ Å« ±Ô¸ð ȤÀº ½Ç½Ã°£ ¾ÖÇø®ÄÉÀÌ¼Ç °³¹ßÀÚµéÀº ÀÌ Á¡À» ¿°µÎ¿¡ µÎ¾î¾ß ÇÑ´Ù.

Listing 6. UniversalImmutableIData¸¦ »ç¿ëÇÏ´Â createRow() ¸Þ¼Òµå


protected Vector createRow(Bicycle bicycle)
{
  Vector vec = new Vector();
    vec.add(new UniversalImmutableIData(bicycle, "modelName"));
    vec.add(new UniversalImmutableIData(bicycle, "modelID"));
    vec.add(new UniversalImmutableIData(bicycle, "manufacturer"));
    vec.add(new UniversalImmutableIData(bicycle, "priceAndCost"));
    vec.add(new UniversalImmutableIData(bicycle, "inventory"));
  return vec;
}

Listing 7. reflection ±â¹ÝÀÇ UniversalImmutableIData


  protected String field = ...  //the field name 
  protected Method accessorMethod = ... //the accessor method
  protected Object source = ... //the DataObject

  ...

  protected void setMethods()
  {
    if (field == null || field.equals(""))
      return;

    //capitalize the first letter of the field, so you get getName, 
    //not getname...
    String firstChar = field.substring(0,1).toUpperCase();
    //remove first letter
    String restOfField = field.substring(1);
    //add together the string "get" + the capitalized first letter, 
    //plus the remaining
    String fieldAccessor = "get" + firstChar + restOfField;
    //cache the method object for future use
    this.setAccessorMethod(fieldAccessor);
  }


  ...


  protected void setAccessorMethod(String methodName)
  {
    try
    {
      accessorMethod = source.getClass().getMethod(methodName, null);
    }
    catch ( ... )
    {
      ...
    }
  }

  ...


  public Object getData()
  {
    try
    {
      return accessorMethod.invoke(source, null);    
    }
    catch ( ... )
    {
      ...
    }
  }

ÆíÁý °¡´ÉÇÑ Áö´ÉÇü µ¥ÀÌÅÍ(MutableIData)¸¦ À§ÇÑ µ¥ÀÌÅÍ °£Á¢ Á¢±Ù Ãþ
MutableIData´Â ImmutableIData¸¦ º¯°æ °¡´ÉÇϵµ·Ï ¸¸µé±â À§ÇØ setData() ¸Þ¼Òµå¸¦ Ãß°¡ÇØ ImmutableIData¸¦ È®ÀåÇÑ´Ù. s
etData() ¸Þ¼Òµå´Â »õ·Î¿î µ¥ÀÌÅÍ °ªÀ» ¸Å°³º¯¼ö·Î ÃëÇÏ¸ç º¯°æÀÌ ¼º°øÇß´ÂÁö¸¦ º¸¿©ÁÖ´Â ºÎ¿ï °ªÀ» ¹ÝȯÇÑ´Ù. DataObjectÀÇ ÇØ´ç Çʵ忡 ´ëÇØ Ä³½¬µÈ µ¥ÀÌÅÍ À¯Çü°ú ÀÏÄ¡½ÃÅ°±â À§Çؼ­´Â º¸Åë »õ·Î¿î µ¥ÀÌÅÍ °ªÀ» setData() ¸Þ¼Òµå¿¡ Àü´ÞÇØ¾ß ÇÑ´Ù. Ç¥ÁØ ±¸ÇöÀº °´Ã¼ À¯ÇüÀ» ¾ÈÀüÇÏ°Ô Å×½ºÆ®ÇÏ¿©, Ŭ·¡½º À¯ÇüÀÌ ÀÏÄ¡ÇÏÁö ¾Ê´Â °æ¿ì false¸¦ ¹ÝȯÇÑ´Ù.

Listing 8. ÀÚÀü°Å Á¦Á¶ ¾÷ü¸¦ À§ÇÑ MutableIData


  public boolean setData(Object data)
  {
     if (!data instanceof String) 
         return false;
     ((Bicycle)this.getSource()).setManufacturer((String)data);
         return true;
  }

ÀÏ´Ü ¸ðµç »õ·Î¿î MutableIData °´Ã¼°¡ ÀÛ¼ºµÇ¸é, ´ëÀÀµÇ´Â Immutable ÀνºÅϽº ´ë½Å¿¡ MutableIData ÀνºÅϽº¸¦ ÀνºÅϽºÈ­Çϱâ À§ÇØ getRow() ¸Þ¼Òµå¸¦ ¼öÁ¤ÇÑ´Ù. ³ª´Â ÇÑ Çʵ尡 º¯°æ ºÒ°¡´ÉÇÒ °æ¿ì ´ÜÁö ImmutableIData °´Ã¼¸¦ ¸¸µé¸é µÈ´Ù´Â °ÍÀ» ¹ß°ßÇÏ¿´´Ù. ±× ¿ÜÀÇ ¹æ¹ýÀ¸·Î ³ª´Â setData() ¸Þ¼Òµå°¡ È£ÃâµÇÁö ¾ÊÀ» °ÍÀÓÀ» ¾Æ´Â »óÅ·ΠMutableIData¸¦ ¸¸µé°í ±×°ÍÀ» °£´ÜÈ÷ Àбâ Àü¿ë Å×ÀÌºí¿¡¼­ »ç¿ëÇÑ´Ù.

»ç¿ëÀÚ Á¤ÀÇ ÆíÁý±âµé
¿©·¯ºÐÀÇ µ¥ÀÌÅ͸¦ ¼öÁ¤ °¡´ÉÇÏ°Ô ¸¸µé¾ú±â ¶§¹®¿¡ Ä¿´Ù¶õ º¯È­°¡ Á¸ÀçÇÑ´Ù: Áï µ¥ÀÌÅ͸¦ ÆíÁýÇÏ·Á¸é »ç¿ëÀÚ Á¤ÀÇ ÆíÁý±â°¡ ÇÊ¿äÇÏ´Ù´Â °ÍÀÌ´Ù. ±âº» ÆíÁý±â¸¦ »ç¿ëÇÒ °æ¿ì JTableÀº Object À¯ÇüÀÇ µ¥ÀÌÅÍ ÆíÁý±â¸¦ ºÎ¸¦ °ÍÀε¥, ÀÌ´Â ½ÇÁ¦·Î´Â String ÆíÁý±âÀÌ´Ù. ÀÏ´Ü ÆíÁýÀÌ ³¡³ª¸é ÆíÁý±â´Â ¸ðµ¨¿¡ º¸°üµÉ
String °ªÀ» ¹ÝȯÇϴµ¥, iData ÃþÀÇ ±¸ÇöÀ» String °ªÀ¸·Î ´ëüÇÑ´Ù. ´ÙÀ½ÀÇ µµÇ¥´Â ÆíÁý±â°¡ iData °£Á¢ Á¢±ÙÀÇ ¹«°á¼ºÀ» À¯ÁöÇϱâ À§ÇØ µû¶ó¾ß ÇÏ´Â ¼ø¼­¸¦ ³ªÅ¸³½ °ÍÀÌ´Ù.

±×¸² 5. ÆíÁý ¼ø¼­
Editing sequence

ºñ·Ï ±âÁ¸ÀÇ ÆíÁý±âµéÀÌ ÀÌ·¯ÇÑ ¼ø¼­¸¦ µû¸£µµ·Ï È®ÀåµÉ ¼ö ÀÖÁö¸¸ ±×·¯ÇÑ ¹æ½ÄÀº ºñÇö½ÇÀûÀÌ´Ù; ÀÌ°ÍÀº Ŭ·¡½º ±ÞÁõÀ¸·Î À̾îÁö¸ç ºÒÇÊ¿äÇÑ º¹À⼺À» ¾ß±âÇÑ´Ù. »ç¿ëÀÚ Á¤ÀÇ ÆíÁý±âµéÀÌ µ¶ÀÚÀûÀÎ »óȲ¿¡¼­ ½Ç¿ëÀûÀÌÁö¸¸ ´ëºÎºÐÀÇ ÆíÁý±âµéÀÌ °°Àº ¼ø¼­¸¦ µû¸¦ °ÍÀ̸ç, ÀÌ´Â °³º°ÀûÀΠŬ·¡½º¿¡ ĸ½¶È­ °ÍÀÌ´Ù. iData ÅøŶÀº UniversalTableCellEditor¶ó°í ºÒ¸®´Â ÀÌ Å¬·¡½ºÀÇ ±¸ÇöÀ» ´ã°í ÀÖ´Ù.

UniversalTableCellEditor´Â È®ÀåÀÌ ¾Æ´Ñ TableCellEditor º¸°ü ¹æ¹ýÀ» »ç¿ëÇÑ´Ù. ÆíÁý½Ã¿¡ UniversalTableCellEditor´Â iData ÃþÀÇ ±¸ÇöÀ¸·ÎºÎÅÍ µ¥ÀÌÅÍ °ªÀ» °¡Á®¿Í ±× °ªÀ¸·Î Æ÷ÇÔÇÏ°í ÀÖ´Â TableCellEditor¸¦ ÃʱâÈ­ÇÑ´Ù. ÆíÁýÀÌ ³¡³ª¸é UniversalTableCellEditor´Â TableCellEditor·ÎºÎÅÍ °ªÀ» Á¶È¸ÇÏ°í ±×¿¡ µû¶ó iData ±¸Çö¿¡ µ¥ÀÌÅ͸¦ ¼³Á¤ÇÑ´Ù. ¸¸ÀÏóÀ½¿¡ ¾Æ¹« ÆíÁý±â°¡ ÁöÁ¤µÇÁö ¾ÊÀ¸¸é, UniversalTableCellEditor´Â iData ±¸ÇöÀÇ µ¥ÀÌÅÍ À¯Çü¿¡ ´ëÇØ JTable³»ÀÇ ±âº» ÆíÁý±â¸¦ ºÒ·¯ ¿Â´Ù.

À§¿¡¼­ ¼³¸íÇÑ ¸ðµç ÆíÁý ¼ø¼­´Â UniversalTableCellEditor³»¿¡ ¿ÏÀüÈ÷ ĸ½¶È­µÈ´Ù. ÀÌ°ÍÀº iData ·ÎÁ÷À» ±¸ÇöÇϱâ À§ÇØ third-party ÆíÁý±â¸¦ Æ÷ÇÔÇÑ ¾î¶² ÆíÁý±âµµ È®ÀåµÉ ÇÊ¿ä ¾øÀÌ »ç¿ëµÉ ¼ö ÀÖÀ½À» ÀǹÌÇÑ´Ù.

³ª´Â °¢ TableColumn ±âº» ÆíÁý±â¸¦ UniversalTableCellEditor¿¡ ¼³Á¤ÇÔÀ¸·Î½á JTable ³»¿¡ ÆíÁý±â¸¦ ¼³Á¤Çϱ⸦ ±ÇÇÑ´Ù. iData ÅøŶÀº ´Ù¼öÀÇ Á¤ÀûÀÎ ÇïÆÛ ¸Þ¼Òµå¸¦ °¡Áö°í ÀÖ´Â À¯Æ¿·¯Æ¼ Ŭ·¡½º¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Ù. À¯Æ¿·¯Æ¼ Ŭ·¡½º ³»ÀÇ configureTable() ¸Þ¼Òµå´Â TableColumnsÀ» ÅëÇØ ¹Ýº¹µÇ¾î, ±× Ä÷³¿¡ ´ëÇÑ ÀÌÀüÀÇ ¼¿ ÆíÁý±â¸¦ °¡Áö°í ÀÖ´Â UniversalTableCellEditorÀÇ »õ·Î¿î ÀνºÅϽº¿¡ °¢°¢ÀÇ ÇöÀç ÆíÁý±â¸¦ ¼³Á¤ÇÑ´Ù.

ÅøŶ¿¡´Â renderer¿Í À¯»çÇÑ ±â´ÉÀ» °¡Áø UniversalTableCellRenderer°¡ µé¾î ÀÖ´Ù. JTree¿Í JComobBox/JList¸¦ À§ÇÑ ¹ü¿ë ÆíÁý±â¿Í renderer Á¶Çյ鵵 ÅøŶ¿¡ µé¾î ÀÖ´Ù.

¿¹: °¡°ÝÀÌ ºñ¿ëº¸´Ù ³ôÀ½À» º¸ÀåÇϱâ À§ÇÑ ¼¿ ³» °ËÁõ ÀÛ¾÷
ÆíÁýÀÇ ÀϹÝÀûÀÎ ¾î·Á¿òÀº ¼¿ ÆíÁýÀÌ ³¡³ª±â Àü¿¡ µ¥ÀÌÅÍ°¡ °ËÁõµÇ¾î¾ß ÇÏ´Â in-cell validation (¼¿ ³» °ËÁõ ÀÛ¾÷)¿¡ ÀÖ´Ù. setData() ¸Þ¼Òµå´Â ¼¿ ³» °ËÁõ ÀÛ¾÷À» À§ÇØ Áß¾Ó ÁýÁßÈ­µÈ ÀúÀå¼Ò¸¦ »ý¼ºÇÑ´Ù. ¾î´À ÇÑ °ªÀÌ ÆíÁýµÈ ÈÄ °¡°ÝÀÌ ºñ¿ëº¸´Ù Àû´Ù¸é »ç¿ëÀÚ¿¡°Ô ÅëÁöÇØ¾ß ÇÏ´Â ¿¹¸¦ °¡Á¤Çغ¸ÀÚ. ÀÌ ¿¹¿¡¼­ ¿ì¸®´Â »ç¿ëÀÚ¿¡°Ô ´ÙÀ½ÀÇ ¿É¼ÇÀÌ Á¦½ÃµÇ±æ ¿øÇÑ´Ù.

  • µÎ °ª ¸ðµÎ ¿ø·¡ÀÇ °ªµé·Î ³öµÎ±â
  • °¡°ÝÀ» ºñ¿ë°ú µ¿ÀÏÇÏ°Ô ¿Ã¸®±â
  • ÆíÁýÀÌ ¾ÈµÈ °ªÀ» º¯°æÇÏ¿© óÀ½ÀÇ °ª°ú ÀÌÁ¦ ¸· ÆíÁýµÈ °ª °£ÀÇ ¿ø·¡ °¡°Ý Â÷À̸¦ À¯ÁöÇϵµ·Ï Çϱâ

ÀÌ ¸ðµÎ´Â setData() ¸Þ¼Òµå¿¡¼­ ºñ±³Àû ½±°Ô ÀÌ·ç¾îÁø´Ù. JOptionPaneÀº »ç¿ëÀÚ°¡ ¼±È£ÇÏ´Â ¿É¼ÇÀ» È®ÀÎÇϵµ·Ï Çϱâ À§ÇØ Ç¥½ÃµÈ´Ù. ÀÏ´Ü ¿É¼ÇÀÌ ¼±ÅÃµÇ¸é °è»êÀÌ ¼öÇàµÇ¾î ÀûÀýÇÑ °ªÀ» Àû¿ëÇÑ´Ù. ÀÌ·¯ÇÑ ºñÁî´Ï½º ·ÎÁ÷À» ±¸ÇöÇϱâ À§ÇÑ Áß¾ÓÁýÁßÈ­µÈ ÀúÀå¼Ò»Ó ¾Æ´Ï¶ó ¸ðµç µ¥ÀÌÅÍ °ªµé¿¡ ´ëÇÑ Á¤º¸´Â iData ±â¹ýÀÇ À¯¿¬¼º¿¡ ÇÙ½ÉÀÌ µÈ´Ù.

Listing 9. ¼¿ ³» °ËÁõ ÀÛ¾÷


String doNotEdit = "Do Not Edit";
String priceEqualsCost = "Price = Cost";
String keepProfitDifference = "Keep Profit Difference";
String keepProfitPercentage = "Keep Profit Percentage";

...

public boolean setData(Object data)
{
    double newCost = new Double(data.toString()).doubleValue();
    double oldCost = this.bicycle.getCost();
    double price = bicycle.getPrice();

    ((Bicycle)this.getSource()).setCost(newCost);

    if (price < newCost)
    {
      Object result = JOptionPane.showInputDialog
      (
        null,
        "Cost you have entered is more than the set price for this bicycle"
        + "\nPlease select from the following options",
        "",
        JOptionPane.QUESTION_MESSAGE,
        null,
        new Object[]{doNotEdit, priceEqualsCost, keepProfitDifference, 
            keepProfitPercentage},
        priceEqualsCost
      );

      if (result != null)
      {
        //persist the data
        if (result.equals(priceEqualsCost))
          this.bicycle.setPrice(bicycle.getCost());  
        //keep the delta between price and cost
        else if (result.equals(keepProfitDifference))
          this.bicycle.setPrice( newCost + (oldPrice - oldCost) ); 
        //keep the same profit percentage
        else if (result.equals(keepProfitPercentage))
          this.bicycle.setPrice( newCost * (oldPrice / oldCost) ); 
      }
    }
    return true;
  }

ºñ JTable°è¿­ÀÇ ÄÄÆ÷³ÍÆ® »ç¿ëÇϱâ
ÀÏ°ü¼ºÀ» À§ÇØ ¿ì¸®ÀÇ ¿¹¿¡¼­ JTableÀ» »ç¿ëÇØ ¿ÔÁö¸¸, ¶Ç ´Ù¸¥ Swing ÄÄÆ÷³ÍÆ®¸¦ ÀÌ¿ëÇÏ´Â °£´ÜÇÑ ¿¹¸¦ »ìÆ캸´Â °Íµµ Àǹ̰¡ ÀÖÀ» °ÍÀÌ´Ù. ÀÚÀü°Å À̸§À» ´ã°í ÀÖ´Â JList¸¦ ¸¸µé¾îº¸ÀÚ. °£´ÜÈ÷ Bicycle °´Ã¼µéÀÇ ÁýÇÕÀ» °è¼Ó ¹Ýº¹ÇÏ°í À̵éÀ» BicycleModelNameImmutableData °´Ã¼ ³»¿¡ ³ÖÀº ÈÄ JList¿¡ Ãß°¡ÇÑ´Ù. JTable¿¡¼­ »ç¿ëµÇ¾ú´ø ¶È°°Àº iData ÀνºÅϽºµéÀÌ Jlist¿¡¼­µµ »ç¿ëµÊ¿¡ ÁÖ¸ñÇÑ´Ù. ÀÌ·¯ÇÑ ÀνºÅϽºµéÀº °°Àº ¹æ½ÄÀ¸·Î ¾î¶² ´Ù¸¥ ÄÄÆ÷³ÍÆ®¿¡¼­µµ »ç¿ëµÉ ¼ö ÀÖ´Ù.

Listing 10. JList ÃʱâÈ­


protected void initList()
{
    ...

    while ( ... )
    {
       //wrap the bicycle in an iData object and add it to the list model
      Bicycle bicycle =  ...
      model.addElement(new BicycleModelNameMutableIData(bicycle)); 
    }
    //wrap the lists renderer in the iData toolkit universal renderer 
    //for JLists
    list.setCellRenderer(new 
      UniversalListCellRenderer(list.getCellRenderer())); 
}

±×¸² 6. JListÀÇ ¿¹
JList example

Áö´ÉÇü È­¸é °£Á¢ Á¢±Ù (iDisplay)
iDisplay ±¸Á¶´Â iData¿¡ ±â¹ÝÇÏ¿© »ç¿ëÀÚ Á¤ÀÇ È­¸éÀ» »ý¼ºÇÏ´Â ÃþÀÌ´Ù. ¿¹¸¦ µé¾î, »ç¿ëÀÚ¿¡°Ô ¼±È£µÇ´Â Manufacturer¸¦ ¾Ë·ÁÁÖ±â À§ÇØ ±× Manufacturer°¡ »¡°£ ¹®ÀڷΠǥ½ÃµÇ¾î¾ß ÇÑ´Ù°í °¡Á¤ÇÏÀÚ. ÀÌ´Â º¸Åë renderer¿¡ ÀÇÇØ Àü´ÞµÇÁö ¾Ê´Â µ¥ÀÌÅÍ °ªµéÀ» Á¶È¸ÇØ¾ß ÇÏ´Â º¹ÀâÇÑ ·ÎÁ÷À» ÇÊ¿ä·Î Çϸç, ±× °á°ú µ¥ÀÌÅÍ Áß½ÉÀÇ »ç¿ëÀÚ Á¤ÀÇ È­¸éÀ» ºñÇö½ÇÀûÀ¸·Î ¸¸µé¾î ¹ö¸®´Â º¹ÀâÇÑ Äڵ带 ³ºÀ» °ÍÀÌ´Ù. iDisplay´Â ±×·¯ÇÑ ½Ã³ª¸®¿À¸¦ ´Ü¼øÇÏ°Ô ¸¸µé±â À§ÇØ iData¿Í ¹ÐÁ¢ÇÏ°Ô ÅëÇÕÇϸç, ±× °úÁ¤¿¡¼­ ¶ÇÇÑ È®ÀåÀ» À§ÇÑ Áß¾Ó ÀúÀå¼Ò¸¦ »ý¼ºÇÑ´Ù.

Àбâ Àü¿ëÀÇ Áö´ÉÇü µ¥ÀÌÅ͸¦ À§ÇÑ È­¸é °£Á¢ Á¢±Ù Ãþ (ImmutableIDIsplay)
ImmutableIDisplay´Â È­¸é¿¡ µû¶ó µ¶ÀÚÀûÀÎ ·ÎÁ÷À» ĸ½¶È­ÇÑ´Ù. ÀÌ°ÍÀº ´ÙÀ½°ú °°Àº ¼¼°¡Áö ÁÖ¿ä renderer À¯Çü¿¡ ´ëÇØ get[Component]CellRendererComponent() ¸Þ¼Òµå¸¦ °¡Áö´Â ImmutableIDisplay¿¡ ÀÇÇØ ¼öÇàµÈ´Ù: TableCellRenderer, TreeCellRenderer ¹× ListCellRenderer°¡ ±×°ÍÀÌ´Ù. ImmutableIDisplayIData´Â ImmutableIDisplay¸¦ Æ÷ÇÔ½ÃÅ´À¸·Î¼­ ImmutableIDisplay¸¦ ImmutableIData¿Í ÅëÇÕÇÑ´Ù.

JTableÀÌ UniversalTableCellRenderer³»ÀÇ getCellRendererComponent()¸¦ È£ÃâÇÏ°í ImmutableIDisplayIData À¯ÇüÀÇ °´Ã¼¿¡ À̸¦ Àü´ÞÇÒ ¶§, UniversalTableCellRenderer´Â getCellRendererComponent ¿äûÀ» ImmutableIDisplayIData°¡ º¸À¯ÇÏ°í ÀÖ´Â ImmutableIDisplay³»ÀÇ »óÀÀÇÏ´Â get[Component]CellRendererComponent¿¡°Ô Àü´ÞÇÑ´Ù.

¿ì¸®ÀÇ ÀÚÀü°Å »óÁ¡ µ¥¸ð·ÎºÎÅÍ ¶Ç ´Ù¸¥ ¿¹¸¦ »ìÆ캸ÀÚ. ÀÌ ¿¹¿¡¼­ »ç¿ëÀÚ°¡ ÀÚÀü°ÅÀÇ price¸¦ ÀÔ·ÂÇϴµ¥ ÀÌ °ªÀÌ costº¸´Ù Àû¾î¼­ price¿Í cost ¼¿ÀÇ ¹ÙÅÁ»öÀÌ »¡°£»öÀ¸·Î º¯ÇÏ°Ô µÈ´Ù. ImmutableIDisplayÀÇ getTableCellRenderer() ¸Þ¼Òµå´Â DataObject¸¦ È£ÃâÇÏ°í price°¡ costº¸´Ù ÀûÀºÁö¸¦ È®ÀÎÇÑ´Ù. ¸¸¾à ±×·¸´Ù¸é ¹ÙÅÁ»öÀº »¡°£»öÀ¸·Î ¼³Á¤µÈ´Ù; ±× ¿ÜÀÇ °æ¿ì´Â Èò»öÀ¸·Î ¼³Á¤µÈ´Ù. Ư¼öÇÑ °æ¿ì°¡ Á¦½ÃµÇÁö ¾ÊÀº °æ¿ì¿¡´Â ¹è°æÀ» ºÐ¸íÈ÷ ±âº» »öÀ¸·Î ¼³Á¤ÇÒ °ÍÀ» ±â¾ïÇÏ´Â °ÍÀÌ Áß¿äÇÏ´Ù. SwingÀº ·£´õ¸µ¿¡ ÀÖ¾î °æ·®È­µÈ ÆÐÅÏÀ» »ç¿ëÇϴµ¥, °°Àº ÄÄÆ÷³ÍÆ®¸¦ µÇÇ®ÀÌÇØ »öÄ¥ÇÑ´Ù. ¸¸ÀÏ Ç¥ÁØ ¼³Á¤ÀÌ Æ¯¼öÇÑ °æ¿ì·Î ÀÎÇØ ¹Ù²î¾ú´Âµ¥ Ç¥ÁØÀÇ °æ¿ì·Î Àç¼³Á¤µÇÁö ¾Ê¾Ò´Ù¸é ¿¹»óÄ¡ ¸øÇÑ °á°ú°¡ ¹ú¾îÁø´Ù.

Listing 11. µ¥ÀÌÅÍ ±â¹ÝÀÇ ¼¿ »öÄ¥À» º¸¿©ÁÖ´Â ÀÚÀü°Å ºñ¿ë¿¡ ´ëÇÑ getTableCellRenderer() ¸Þ¼Òµå


public TableCellRenderer getTableCellRenderer(JTable table, Object value, 
  boolean isSelected, boolean hasFocus, int row, int column)
{
      //cache old background for change comparisons
      Color oldColor = renderer.getBackground(); 
      //cache old background for change comparisons
      Color newColor = null;
      //check to see if Object is a MutableIData
      if (value instanceof MutableIData)
      {
        MutableIData arg = (MutableIData)value;  //cast it.
        Bicycle bicycle = (Bicycle)arg.getSource();
        if (arg.getData() instanceof Number)  //check the data type
        {
        // retrieve price and cost from the DataObject
          double cost = ((Number)arg.getData()).doubleValue();
          double price = bike.getPrice();
          //make comparisons
          if (price > cost)
            newColor = Color.cyan;
          else
            newColor = Color.red;
        }
      }
      // check and see if color changed
      if (!newColor.equals(oldColor))
          this.setBackground(newColor);
}

±×¸² 7. °¡°Ý°ú ºñ¿ë¿¡ ´ëÇÑ ¹è°æ»ö °ËÁõ Å×À̺í
Table with price and cost background color validation

ÆíÁý °¡´ÉÇÑ Áö´ÉÇü µ¥ÀÌÅÍ¿¡ ´ëÇÑ È­¸é °£Á¢ Á¢±Ù Ãþ (MutableIDisplay)
º¯°æ ºÒ°¡´É/º¯°æ °¡´ÉÀÇ ±¸ºÐÀº iDisplay ±¸Çö¿¡¼­µµ ¸¶Âù°¡ÁöÀÌ´Ù. MutableIDisplay´Â ÆíÁý±â¿¡ ÇØ´çÇϸç, ImmutableIDisplay´Â renderer¿¡ ÇØ´çÇÑ´Ù. ImmutableIDisplayIData¿¡¼­¿Í ¸¶Âù°¡Áö·Î MutableIDisplayIData´Â MutableIData¸¦ È®ÀåÇϸç MutableIDisplay¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Ù. ÀÌ°ÍÀÇ »ç¿ë ¹æ¹ýÀº get[Component]CellRenderer() ¸Þ¼Òµå°¡ ¾Æ´Ñ get[Component]CellEditor() ¸Þ¼Òµå¸¦ ±¸ÇöÇÑ´Ù´Â Á¡À» Á¦¿ÜÇϸé ImmutableIDisplayÀÇ »ç¿ë¹ý°ú µ¿ÀÏÇÏ´Ù. ÅøŶ¿¡´Â JTable, JTree ¹× JComboBox¿ë »ç¿ëÀÚ Á¤ÀÇ ÆíÁý±â°¡ µé¾î ÀÖ´Ù.

get[Component]CellRenderer()¿Í get[Component]CellEditor() ¸Þ¼Òµå¸¦ iDisplay¿¡ Àü´ÞÇϸé À¯¿ëÇÑ °£Á¢ Á¢±Ù ÃþÀÌ »ý¼ºµÈ´Ù. ÁÖ¿äÇÑ °á°ú·Î´Â È­¸é ¼³Á¤°ú ±â´ÉÀ» Ä¿½ºÅ͸¶ÀÌ¡Çϱâ À§ÇÑ Áß¾ÓÀÇ, ĸ½¶È­µÈ ÀúÀå¼Ò°¡ ¸¸µé¾îÁø´Ù´Â °ÍÀÌ´Ù. È®Àå ´ë½Å¿¡ iData¸¦ iDisplay¿¡ ´ëÇÑ containment·Î »ç¿ëÇϸé Ŭ·¡½º ±ÞÁõÀ» Á¦ÇÑÇÏ´Â °Í ¿Ü¿¡ À¯¿¬¼º°ú È®À强À» ÁõÁø½ÃŲ´Ù. °¡Àå Áß¿äÇÑ °ÍÀº Á¾Á¾ ¸Å¿ì º¹ÀâÇÑ È­¸é ·ÎÁ÷À» ´ã°í ÀÖ´Â »ç¿ëÀÚ Á¤ÀÇ ÆíÁý±â¿Í rendererÀÇ Çʿ伺À» °ÅÀÇ ¾ø¾Ø´Ù´Â Á¡ÀÌ´Ù. ºñ·Ï ¿ÏÀüÇÑ ÇüÅÂÀÇ »ç¿ëÀÚ Á¤ÀÇ ÆíÁý±â¿Í renderer°¡ ÇÊ¿äÇϱä ÇÏÁö¸¸ È­¸éÀÇ ´ë´Ù¼ö´Â iDisplay°¡ Á¦°øÇÏ´Â °£Á¢ Á¢±Ù ÃþÀ» »ç¿ëÇÏ¿© ±¸ÇöµÉ ¼ö ÀÖ´Ù.

´ÜÁ¡
iData ±â¼úÀ» ±¸ÇöÇÒ ¶§ ¿°µÎ¿¡ µÎ¾î¾ß ÇÒ ¸î °¡Áö ´ÜÁ¡ÀÌ ÀÖ´Ù.

  • ¼º´É : iData ±â¹ýÀº ´ëºÎºÐÀÇ ¾ÖÇø®ÄÉÀ̼ǿ¡ ÀÖ¾î »ó´çÇÑ ¼º´É»óÀÇ ºÎÇϸ¦ °¡Á® ¿ÀÁö ¾Ê´Â´Ù. ÀÌ ±â¹ýÀº ·ÎÁ÷À̳ª ÇÁ·Î¼¼½ÌÀÌ ¾Æ´Ñ »ó´çÇÑ ¾çÀÇ °£Á¢ Á¢±ÙÀ» Á¤ÀÇÇϱ⠶§¹®ÀÌ´Ù. ±×·¸Áö¸¸ ¸¸¾à getData()/setData() ¸Þ¼Òµå ȤÀº get[ÄÞÆ÷³ÍÆ®]CellRenderer()/Editor() ¸Þ¼ÒµåµéÀÇ ±¸Çö ³»¿ëÀÌ ³Ê¹« ¸¹Àº ·ÎÁ÷À» °®°í ÀÖ´Ù¸é ¹®Á¦°¡ ¹ß»ýÇÒ °ÍÀÌ´Ù. ÄÄÆ÷³ÍÆ®°¡ »öÄ¥µÉ ¶§¸¶´Ù ÄÄÆ÷³ÍÆ® ³»ÀÇ ¸ðµç ¼¿¿¡ ´ëÇØ ÀÌ ¸Þ¼Òµå ³»ÀÇ ¾î¶² ·ÎÁ÷ÀÌ È£ÃâµÈ´Ù. ÀÌ ¸Þ¼Òµå¸¦ °¡´ÉÇÑ ÇÑ °£°áÇÏ°Ô À¯ÁöÇϵµ·Ï ÇÑ´Ù.
  • Äڵ庣À̽º¿¡ Ãß°¡µÇ´Â Ŭ·¡½ºµé : iData ±â¼úÀ» »ç¿ëÇÏ·Á¸é ¼ö¸¹Àº Ŭ·¡½º°¡ ÇÊ¿äÇÏ´Ù´Â »ç½ÇÀº ÀǽÉÀÇ ¿©Áö°¡ ¾ø´Ù. ÀÌ°ÍÀº ¾î¶² °´Ã¼ ÁöÇâ ±â¹ý¿¡¼­µµ ¿¹»óµÇ´Â °ÍÀÌ°í, ¶ÇÇÑ ÀÏÁ¤ ºÎºÐ ÀÌÁ¡µµ ÀÖ´Ù. »ç½Ç ƯÁ¤ ¾ÖÇø®ÄÉÀ̼ǿ¡ ±¹ÇÑµÈ ºñÁî´Ï½º ·ÎÁ÷ÀÇ ´ë´Ù¼ö°¡ ÀÌ·¯ÇÑ °¡¿ÜÀÇ Å¬·¡½º¿¡ µé¾î ÀÖ°í, ÀÌ´Â ±×·¸Áö ¾Ê¾Ò´Ù¸é ¹ß»ýÇÏÁö ¾Ê¾ÒÀ» ĸ½¶È­°¡ ÀÌ·ç¾îÁöµµ·Ï ÇÑ´Ù. ¸¸ÀÏ Å¬·¡½ºµéÀÌ ÃÖ¼Ò·Î À¯ÁöµÇ¾î¾ß ÇÑ´Ù¸é ÀÌ°ÍÀº ÃÖ¼±ÀÌ ¼±ÅÃÀÌ ¾Æ´Ò ¼ö ÀÖ´Ù. º¸Åë ¼º´É ºñ¿ëÀÇ ¹®Á¦°¡ ÀÖ±ä ÇÏÁö¸¸, ÀÌ·¸°Ô ±Ô¸ð¿¡ ¹Î°¨ÇÑ ¾ÖÇø®ÄÉÀ̼ÇÀ» À§ÇØ ¸¹Àº ÃÖÀûÈ­ ¹æ¹ýÀÌ ¼Ò°³µÇ°í ÀÖ´Ù. ÄÚµåÀÇ º¹À⼺, Ŭ·¡½ºÀÇ ¼ö, ±×¸®°í ¼º´É ºñ¿ë¿¡ ´ëÇÑ °áÁ¤À» ³»¸± ¶§ ¾ÖÇø®ÄÉÀ̼ÇÀÇ ¿ä±¸»çÇ×ÀÌ °í·ÁµÇ¾î¾ß ÇÑ´Ù.
  • ÇнÀ °î¼± : ÀÌ°ÍÀÌ °¡Àå µÎµå·¯Áø ´ÜÁ¡ÀÌ´Ù. iData ±â¹ýÀº À¯¿¬¼º°ú È®À强À» ¿°µÎ¿¡ µÎ°í ¼³°èµÇ¾ú´Ù. ÀÌ°ÍÀº óÀ½¿¡´Â ±â¸¦ Á×À̰ųª È¥¶õ½º·´°Ô ÇÏ´Â »ó´çÇÑ ¾çÀÇ Ãß»óÈ­¸¦ ÇÊ¿ä·Î ÇÑ´Ù. ³ª´Â ¾î´À Á¤µµÀÇ ¿¬±¸ ÈÄ¿¡ ÀÌ ¾ÆÅ°ÅØó¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù°í ¹ÏÁö¸¸, ²ÙÁØÇÑ ÁÖÀÇ°¡ ÇÊ¿äÇÏ´Ù.

°á·Ð
ÄÄÆ÷³ÍÆ® ¸ðµ¨À» iData °£Á¢ Á¢±Ù Ãþ°ú °áÇÕµÈ Áö´ÉÇü µ¥ÀÌÅͷΠä¿ì¸é °í±Þ UI ±â´ÉÀ» ±¸ÇöÇϱâ À§ÇÑ À¯¿¬ÇÏ°í È®À强 ÀÖ´Â Áß¾ÓÀÇ ÀúÀå¼Ò¸¦ ¸¸µé ¼ö ÀÖ´Ù. ¶ÇÇÑ
ÀÌ ±â´ÉÀº À¯¿¬¼º°ú Àç»ç¿ë¼ºÀ» ÁõÁø½ÃÅ°±â À§ÇØ ¿ÏÀüÈ÷ ĸ½¶È­µÈ Ŭ·¡½ºµé ³»¿¡ ºñ±³Àû ´Ü¼øÇÑ ·ÎÁ÷À¸·Î ±¸ÇöµÉ ¼ö ÀÖ´Ù. ¿©±â¿¡ ¿ÀÇ ¼Ò½º ÅøŶÀÌ ´õÇØÁüÀ¸·Î½á iData ±â¹ýÀÇ ÅëÇÕÀÌ ½¬¿öÁø´Ù. ¸¹Àº Äڵ尡 ÀÌ¹Ì ÀÛ¼ºµÇ°í Å×½ºÆ®µÇ¾î Àֱ⠶§¹®ÀÌ´Ù. ¼³¸íµÈ ±â¹ýÀ» ¼º°øÀûÀ¸·Î »ç¿ëÇϱâ À§ÇØ °¢ ¾ÖÇø®ÄÉÀ̼ÇÀÌ ÇÊ¿ä·Î ÇÏ´Â °ÍÀº iData °£Á¢ Á¢±Ù ÃþÀÇ ÀÚü ±¸Çö »ÓÀÌ´Ù. ¿©±â¿¡´Â Swing ÄÄÆ÷³ÍÆ®¿¡ ´ëÇÑ Áß´ëÇÑ Ä¿½ºÅ͸¶ÀÌÁ¦À̼ǵµ, »ç¿ëÀÚ Á¤ÀÇ ¸ðµ¨µµ, ±×¸®°í Ç¥ÁØ Swing ±â´ÉÀÇ º¯°æµµ ¾ø´Ù. ´ÜÁö ÁÖÀÇ ±í°Ô ¹èÄ¡ÇÑ °£Á¢ Á¢±ÙÀÌ ÀÖÀ» »ÓÀÌ´Ù. °á°úÀûÀ¸·Î º¹ÀâÇÑ È­¸é ±â´ÉÀÇ ±¸Çö°ú Ä¿½ºÅ͸¶ÀÌÁ¦À̼ÇÀ» Á÷°üÀûÀÌ°í, À¯¿¬Çϸç, È®Àå °¡´ÉÇÑ ¹æ½ÄÀ¸·Î ´Ü¼øÈ­½ÃŲ ½Ã½ºÅÛÀÌ ³ª¿À´Â °ÍÀÌ´Ù.

¿ÀÇ ¼Ò½º note
³ª´Â iData ¹æ½ÄÀ» ¼º°øÀûÀ¸·Î ±¸ÇöÇϴµ¥ ÅøŶÀÌ ÇʼöÀûÀ̶ó°í ¹Ï°í ÀÖ´Ù. ÅøŶÀº ¿©·¯ ¹ø °³¹ßµÈ ÃÖÀûÈ­ ¹× ÇïÆÛ Å¬·¡½º»Ó ¾Æ´Ï¶ó »ç¿ëÀÚ Å×½ºÆ®¸¦ °ÅÄ£ Äڵ带 Á¦°øÇÏ¿© ÅëÇÕ ½Ã°£À» ÃÖ¼ÒÈ­½ÃÄÑ ÁØ´Ù. ¼³°è ¹× ±¸ÇöÀº ³»°¡ Âü¿©ÇÑ ÇÁ·ÎÁ§Æ®ÀÇ ¿µÇâÀ» ¹Þ¾Ò´Ù. ºÐ¸íÈ÷ ¿©·¯ºÐÀº ÅøŶÀ» ¼öÁ¤Çϸé ÈξÀ ½±°Ô ±¸ÇöµÉ ¼ö ÀÖÀ» ¿ä±¸ »çÇ×À» °¡Áö°í ÇÁ·ÎÁ§Æ®¸¦ ã¾Æ³ÂÀ» °ÍÀÌ°í, °³¹ßÀÚµéÀÌ ±× ¼³°è¸¦ °³¼±½ÃÅ°´Â °ÍÀ» µµ¿Í º¸´Ù Á¢±Ù¼º ÀÖ°í °­·ÂÇÑ ±¸ÇöÀ» ¸¸µé¾î³»±â ¶§¹®¿¡ ±× À¯¿ë¼ºÀº ÈξÀ ´õ Ä¿Áú °ÍÀÌ´Ù. °í

ÅøŶÀº Artistic ¶óÀ̼±½º ÇÏ¿¡ SourceForge.netÀ» ÅëÇØ ¹èÆ÷µÈ´Ù. ÇÁ·ÎÁ§Æ® ȨÆäÀÌÁö (Âü°íÀÚ·á)¿¡´Â Àüü ¼Ò½º, ¹®¼­ ¹× ¹ÙÀ̳ʸ® ¹èÆ÷ÆÇ »Ó ¾Æ´Ï¶ó listserv¿Í ±âŸ Á¤º¸¿¡ ´ëÇÑ ¸µÅ©µµ ÀÖ´Ù. ¿©·¯ºÐÀº ÇâÈÄ Ãâ½ÃÆÇ¿¡ Æ÷ÇÔ½Ãų ÄÚµå °³¼±¿¡ ±â¿©ÇØ ´Þ¶ó´Â °Ý·Á¸¦ ¹Þ´Â´Ù. ¿ÀÇ ¼Ò½º Çù¾àÀÇ ±ÔÁ¤¿¡ µû¶ó ¸ðµç ¾ÖÇø®ÄÉÀ̼ǿ¡ ´ëÇÑ ÀÌ¿ëÀÌ ¹«·áÀÌ´Ù.

Âü°íÀÚ·á

¸ñ Â÷:
iData ±â¹ýÀÇ ¼¼ °¡Áö Ãþ
DataObjects
°£Á¢ Á¢±Ù : iData Ãþ
Áö´ÉÇü È­¸é °£Á¢ Á¢±Ù (iDisplay)
´ÜÁ¡
°á·Ð
¿ÀÇ ¼Ò½º note
Âü°í ÀÚ·á
ÇÊÀÚ ¼Ò°³
±â»ç¿¡ ´ëÇÑ Æò°¡
°ü·Ã dW ¸µÅ©:
¿ÀÇ ¼Ò½º note
JavaBeans: The Perfect Roast?
ÀÚ¹Ù ºó Reflecting, introspecting ¹× Ä¿½ºÅ͸¶ÀÌ¡Çϱâ
SwingÀÇ JTable ÄÄÆ÷³ÍÆ®¿¡¼­ ¼¿ ·»´õ¸µÇϱâ
ÀÚ¹Ù ºó Reflecting, introspecting ¹× Ä¿½ºÅ͸¶ÀÌ¡Çϱâ
Subscribe to the developerWorks newsletter
US ¿ø¹® Àбâ
Also in the Java zone:
Tutorials
Tools and products
Code and components
Articles
ÇÊÀÚ¼Ò°³
Jonathan SimonÀº ÇöÀç JPMorganChaseÀÇ Ã¤±Ç °Å·¡ ½Ã½ºÅÛÀÇ Å¬¶óÀ̾ðÆ® °³¹ßÀ» Ã¥ÀÓÁö°í ÀÖ´Ù. ±×´Â Swing, ½Ç½Ã°£ Ŭ¶óÀ̾ðÆ®, third-party ÄÄÆ÷³ÍÆ® suite, Ŭ¶óÀ̾ðÆ® ¾ÆÅ°ÅØó ¹× Ŭ¶óÀ̾ðÆ® ¹èÄ¡µî°ú °°ÀÌ Å¬¶óÀ̾ðÆ® Ãø ±â¼úÀÇ ¿©·¯ ¸é¿¡ °æÇèÀ» °¡Áö°í ÀÖ´Ù. JonathanÀº ¶ÇÇÑ À½¾Ç Çб³¿¡¼­ »ç»çÇÑ Å¸¾Ç±â ¿¬ÁÖÀڷμ­, À½¾Ç ¿¬ÁÖ¿Í À½¾Ç ¹× À½¼º °ü·Ã ¼ÒÇÁÆ®¿þ¾î °³¹ßÀ» Áñ±ä´Ù.
ÀÌ ±â»ç¿¡ ´ëÇÏ¿© ¾î¶»°Ô »ý°¢ÇϽʴϱî?

Á¤¸» ÁÁ´Ù (5) ÁÁ´Ù (4) ±×Àú±×·¸´Ù (3) ¼öÁ¤º¸¿ÏÀÌ ÇÊ¿äÇÏ´Ù(2) ÇüÆí¾ø´Ù (1)

  È¸»ç¼Ò°³  |  °³ÀÎÁ¤º¸ º¸È£Á¤Ã¥  |  ¹ý·ü  |  ¹®ÀÇ