JFC(Swing°ú 2D ±×·¡ÇÈ)

1999³â 4¿ù 14ÀÏ Ã¹ ÃâÆÇ, ±Û/À±°æ±¸

Copyright © 1999 Yoon Kyung Koo. All Rights Reserved.
¹«´Ü ÀüÀ縦 ±ÝÇÕ´Ï´Ù.
ÀÌ ±ÛÀº ¿ù°£Áö ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®¿þ¾î 1999³â 5¿ùÈ£ÀÇ ¸¶¼Ò ÁִϾ ½Ç¸° ÀÚ¹Ù À̾߱âÀÇ ÃÊ°í¿¡ ±â¹ÝÀ» ÇÏ°í ÀÖ½À´Ï´Ù.
ÀÚ¹Ù À̾߱⸦ Æ÷ÇÔÇÑ 1999³â 1¿ùºÎÅÍ ¿©¼¸ ´Þµ¿¾È ¿¬ÀçµÇ¾ú´ø ¸¶¼Ò ÁÖ´Ï¾î ¿ø°íµéÀº
"Ãʺ¸ÀÚ¸¦ À§ÇÑ ÇÁ·Î±×·¡¹Ö ¸¶½ºÅÍ"¶õ ÇÑ ±ÇÀÇ ´ÜÇົÀ¸·Î ¹­¿© ºÏ¸¶Å© ÃâÆǻ翡¼­ Ãâ°£µÇ¾ú½À´Ï´Ù.
Âü°íÇϽñ⠹ٶø´Ï´Ù.


[1. Swing] - [2. 2D Graphics]


¿©±â¿¡¼­ ´Ù·ê ³»¿ëÀº ÀÚ¹ÙÀÇ ¸ÚÁø ¿Ü¾ç¿¡ ´ëÇÑ °ÍÀÔ´Ï´Ù. ¾Æ¹«¸® ¸ÀÀÖ´Â »§À̶ó ÇÏ´õ¶óµµ °Ñº¸±â¿¡ ¸ÔÀ½Á÷½º·´Áö ¾ÊÀ¸¸é ½±°Ô ¼ÕÀÌ °¡Áö ¾Ê½À´Ï´Ù. ÈǸ¢ÇÑ ¿ä¸®¸¦ Æò°¡ÇÒ ¶§¿¡ ¸À»Ó¸¸ ¾Æ´Ï¶ó »ö»ó°ú Çâ µî °Ñ¸ð¾çµµ Áß¿äÇÑ ±âÁØÀÌ µÇµíÀÌ, ÁÁÀº ÇÁ·Î±×·¡¹Ö µµ±¸¶ó¸é ¸ÚÁö°í Æí¸®ÇÑ ±×·¡ÇÈ »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÏ¿© »ç¿ëÀÚµéÀÇ È£°¨À» ¾òÀ» ¼ö ÀÖ¾î¾ß ÇÕ´Ï´Ù.

ÀÚ¹Ù´Â ´Ü¼øÇÑ ÇÁ·Î±×·¡¹Ö ¾ð¾î°¡ ¾Æ´Ï¶ó ÇÁ·Î±×·¡¹Ö °³¹ß µµ±¸·Î¼­ÀÇ Æ¯¼ºµµ °¡Áö´Â º¹ÇÕÀûÀÎ °³¹ß Ç÷§ÆûÀÔ´Ï´Ù. AWT¶ó´Â ÀÚ¹ÙÀÇ µ¶Æ¯ÇÑ À©µµ¿ì ÀÎÅÍÆäÀ̽º°¡ ÀÖÁö¸¸ ¿©±â¿¡¼­ ¼Ò°³ÇÏ´Â ³à¼®Àº ÈξÀ ´õ ¸ÚÁø ¸ð½ÀÀ» ÇÏ°í ÀÖ½À´Ï´Ù. ´í½º À½¾ÇÀÇ ÇÑ À帣ÀÌÀÚ, ±×³×¶ó´Â ¶æµµ °¡Áø ½ºÀ®ÀÌ ¹Ù·Î ÀÌ ¸ÚÁø ³à¼®ÀÇ À̸§ÀÔ´Ï´Ù.

AWT À©µµ¿ì ÄÄÆ÷³ÍÆ®µéÀº ¸ðµÎ °¢ ¿î¿µÃ¼Á¦¿¡ °íÀ¯ÇÑ À©µµ¿ì ÄÄÆ÷³ÍÆ®µéÀ» ºô¾î¾²´Â ¹æ½ÄÀ¸·Î ±¸ÇöµÇ¾î ÀÖ½À´Ï´Ù.

¿¹¸¦ µé¾î ¹öÆ°À» ³ªÅ¸³»´Â Button ÄÄÆ÷³ÍÆ®´Â ¸¶ÀÌÅ©·Î¼ÒÇÁÆ® À©µµ¿ì ¿î¿µÃ¼Á¦¿¡¼­´Â ¸¶ÀÌÅ©·Î¼ÒÇÁÆ® À©µµ¿ì°¡ Á¦°øÇÏ´Â ¹öÆ° ÄÄÆ÷³ÍÆ®¸¦ ºô¾î¾²°í, À¯´Ð½º ¿î¿µÃ¼Á¦¿¡¼­´Â X À©µµ¿ì ½Ã½ºÅÛÀÌ Á¦°øÇÏ´Â ¹öÆ° À§Á¬À» ºô¾î¾¹´Ï´Ù. ±×·¡¼­, ÀÚ¹Ù ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ´Â ¿î¿µ üÁ¦¿¡ µû¶ó ±× ¸ð¾çÀÌ Á¶±Ý¾¿ ´Ù¸£°Ô ³ªÅ¸³ª´Â ´ÜÁ¡ÀÌ ÀÖ¾ú½À´Ï´Ù.

½ºÀ® ÄÄÆ÷³ÍÆ®´Â AWT À©µµ¿ì ÄÄÆ÷³ÍÆ®ÀÇ ÀÌ·± ÇѰ踦 ±Øº¹ÇÏ¿© ÀÚ¹Ù¿¡ °íÀ¯ÇÑ ÄÄÆ÷³ÍÆ®·Î ¼³°èµÇ¾ú½À´Ï´Ù. ÀÚ¹Ù ÄÚµå·Î °¢ ÄÄÆ÷³ÍÆ®µéÀÇ ¿Ü¾ç°ú ±â´ÉÀ» ¿ÏÀüÈ÷ »õ·Ó°Ô ¼³°èÇÏ¿´±â ¶§¹®¿¡ °¢ ¿î¿µÃ¼Á¦°¡ Á¦°øÇÏ´Â À©µµ¿ì ½Ã½ºÅÛ¿¡ ´ëÇÑ ÀÇÁ¸µµ°¡ ¾øÀ¸¸ç ¾ÆÁÖ Àß»ý±ä µ¥´Ù°¡ ±â´Éµµ ´Ù¾çÇØÁ³½À´Ï´Ù.

<±×¸²> ½ºÀ® ÄÄÆ÷³ÍÆ®¸¦ »ç¿ëÇÑ ¿¹Á¦ ÇÁ·Î±×·¥

½ºÀ® ÄÄÆ÷³ÍÆ®´Â ÈçÈ÷ JFC¶ó°íµµ ºÒ·ÁÁö´Âµ¥ ¿©±â¿¡¼­ JFC´Â ÀÚ¹Ù ÆÄ¿îµ¥ÀÌ¼Ç Å¬·¡½º(Java Foundation Class)ÀÇ ¸Ó¸®±ÛÀÚÀÔ´Ï´Ù.

»ç½Ç JFC´Â ½ºÀ® ÄÄÆ÷³ÍÆ® ±â¼ú¸¸À» ÁöĪÇÏ´Â À̸§ÀÌ ¾Æ´Ï¶ó, JDK 1.0 ¹öÀü(ÇöÀç´Â 1.2¹öÀüÀÔ´Ï´Ù)ÀÇ AWT Ŭ·¡½º ±â´ÉÀ» ´ëüÇÒ »õ·Î¿î ´ÙÁß Ç÷§Æû »ç¿ëÀÚ ÀÎÅÍÆäÀ̽ºÀÎ ½ºÀ® ÄÄÆ÷³ÍÆ®¸¦ ÇÙ½ÉÀ¸·Î, °³¼±µÈ ±×·¡ÇÈ ±â´ÉÀÎ 2D ±×·¡ÇÈ, ½ÅüºÎÀÚÀ¯ÀÚ¿¡ ´ëÇÑ Áö¿ø, ±×¸®°í ±âÁ¸ÀÇ AWT µî »õ·Î¿î ÀÚ¹ÙÀÇ ±×·¡ÇÈ »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º¿Í ±×·¡ÇÈ ±â´É¿¡ °ü·ÃµÈ ÇÙ½É ±â¹Ý ±â¼úÀ» Á¦°øÇϴ Ŭ·¡½ºµéÀ» Æ÷°ýÇÏ´Â À̸§ÀÔ´Ï´Ù. JFCÀÇ ÀÎÅÍ³Ý È¨ÆäÀÌÁö´Â http://java.sun.com/products/jfc ÀÌ¸ç ¿©±â¿¡¼­ JFC¿¡ ´ëÇÑ ÃÖ±ÙÀÇ ¼Ò½ÄÀ» Á¢ÇÒ ¼ö ÀÖ½À´Ï´Ù.

¿©±â¿¡¼­´Â ÀÚ¹ÙÀÇ ¾Æ¸§´Ù¿î ½ºÀ® ÄÄÆ÷³ÍÆ®¿Í ±×·¡ÇÈ ±â´ÉÀ» Å©°Ô È®ÀåÇÑ 2D ±×·¡ÇÈÀ» ´Ù·ì´Ï´Ù. ½ºÀ® ÄÄÆ÷³ÍÆ®¿¡ ´ëÇÑ ¼³¸íÀº AWT ÄÄÆ÷³ÍÆ®¸¦ ÀÌÇØÇÏ°í ÀÖ´Ù´Â ÀüÁ¦ ÇÏ¿¡¼­ ÁøÇàÇÒ °ÍÀ̹ǷÎ, Ȥ½Ã AWT À©µµ¿ì ½Ã½ºÅÛ¿¡ ´ëÇؼ­ »ý¼ÒÇϽŠµ¶ÀÚµéÀÌ °è½Ã´Ù¸é ¸ÕÀú AWT À©µµ¿ì ½Ã½ºÅÛ¿¡ ´ëÇÏ¿© °øºÎÇÏ½Ç ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.


1. »õ·Î¿î ¾ó±¼, ½ºÀ® ¼Â

½ºÀ® ¼ÂÀº ÀÚ¹Ù 2¿¡ Æ÷ÇÔµÈ »õ·Î¿î »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º ÄÄÆ÷³ÍÆ®µéÀÇ ÁýÇÕÀ» °¡¸®Å°´Â ¸»ÀÔ´Ï´Ù.

ÀÚ¹Ù 2°¡ µîÀåÇϱâ ÀÌÀü¿¡´Â AWT ÄÄÆ÷³ÍÆ®µéÀÌ Á¦°øµÇ¾ú´Âµ¥ À̵éÀº ÀÚ¹Ù°¡ ½ÇÇàµÇ´Â ¿î¿µ üÁ¦¿¡¼­ Á¦°øÇÏ´Â À©µµ¿ì ½Ã½ºÅÛÀÇ ÄÄÆ÷³ÍÆ®µéÀ» ºô¾î¼­ ÀÚ¹ÙÀÇ À©µµ¿ì ±â´ÉÀ» ½ÇÇöÇÏ´Â ¹æ½ÄÀ» äÅÃÇÏ°í ÀÖ¾ú½À´Ï´Ù. ÀÌ ¹æ½Ä¿¡¼­´Â ÀÚ¹ÙÀÇ °¢ À©µµ¿ì ÄÄÆ÷³ÍÆ®¿¡ ÇØ´çÇÏ´Â ¿î¿µ üÁ¦ À©µµ¿ì ½Ã½ºÅÛÀÇ ÄÄÆ÷³ÍÆ®¸¦ ÇÊ¿ä·Î ÇÏ¿´±â ¶§¹®¿¡ ¼öÇà ¼º´ÉÀ̳ª ±¸ÇöÀÇ ÀÌÁ¡ÀÌ ÀÖ¾úÁö¸¸, ±âÁ¸ ÄÄÆ÷³ÍÆ®µéÀÇ Á¦¾àÀ¸·Î ÀÎÇØ ´Ù¾çÇÑ ±â´ÉÀ» Á¦°øÇÒ ¼ö ¾ø¾ú°í, ½ÇÇàµÇ´Â ¿î¿µ üÁ¦¿¡ µû¶ó ½ÇÇàµÇ´Â ÇÁ·Î±×·¥ÀÇ ¸ð½ÀÀÌ Á¶±Ý¾¿ ´Þ¶óÁö´Â ´ÜÁ¡ÀÌ ÀÖ¾ú½À´Ï´Ù.

½ºÀ® ÄÄÆ÷³ÍÆ®µéÀº ÀÚ¹Ù°¡ Á÷Á¢ °¢ ÄÄÆ÷³ÍÆ®µéÀ» ·»´õ¸µÇÏ°í ±â´ÉÀ» ±¸ÇöÇÏ´Â »õ·Î¿î ±â¼úÀÎ °æ·®(lightweight) ÄÄÆ÷³ÍÆ® ±â¹ýÀ» Àû¿ëÇÏ¿© ¸¸µç ÄÄÆ÷³ÍÆ®µé·Î ±â¹Ý ¿î¿µ üÁ¦ÀÇ À©µµ¿ì ½Ã½ºÅÛ¿¡ ´ëÀÀÇÏ´Â ÄÄÆ÷³ÍÆ®°¡ ÀÖÀ» ÇÊ¿ä°¡ ¾ø¾î, Æí¸®ÇÏ°í ´Ù¾çÇÑ »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÒ ¼ö ÀÖ½À´Ï´Ù. ½ºÀ® ÄÄÆ÷³ÍÆ®¸¦ ±âº»À¸·Î Æ÷ÇÔÇÑ ÀÚ¹Ù 2 Ç÷§ÆûÀÌ °³¹ßµµ±¸ÀÎ JDK 1.2 ¹öÀü°ú ÇÔ²² 1998³â ¸»¿¡ ¼Ò°³µÇ¸é¼­, ½ºÀ® ÄÄÆ÷³ÍÆ®´Â ±âÁ¸ÀÇ AWT ÄÄÆ÷³ÍÆ®µéÀ» Á¦Ä¡°í ÀÚ¹ÙÀÇ Ç¥ÁØ ÀÎÅÍÆäÀ̽º·Î °¢±¤¹Þ°í ÀÖ½À´Ï´Ù. ÀÌÁ¦ ½ºÀ® ÄÄÆ÷³ÍÆ®µéÀ» ¸¸³ªº¼±î¿ä?

1.1 ½ºÀ® ÄÄÆ÷³ÍÆ®µé

javax.swing ÆÐÅ°Áö¿¡´Â ´Ù¾çÇÑ ½ºÀ® ÄÄÆ÷³ÍÆ® Ŭ·¡½ºµéÀÌ µé¾î ÀÖ½À´Ï´Ù. ¸ÕÀú ´ÙÀ½°ú °°Àº AWT ÄÄÆ÷³ÍÆ®¿¡ ´ëÀÀÇÏ´Â ½ºÀ® ÄÄÆ÷³ÍÆ® Ŭ·¡½ºµéÀÌ Á¸ÀçÇÕ´Ï´Ù. ÀÌµé ½ºÀ® ÄÄÆ÷³ÍÆ®ÀÇ À̸§Àº ´ëºÎºÐ AWTÀÇ ÄÄÆ÷³ÍÆ® Ŭ·¡½ºµé À̸§ ¾Õ¿¡ ÀÚ¹ÙÀÇ Ã¹ ¿µ¹®ÀÚÀÎ 'J'¸¦ ºÙÀÎ ¸ð¾çÀ» ÇÏ°í ÀÖ½À´Ï´Ù.

JButton, JMenuItem, JMenu, JCheckBox, JLabel, JList, JMenuBar, JPanel, JPopupMenu, JScrollBar, JScrollPane, JTextArea, JTextField, JApplet, JDialog, JFrame, JWindow

½ºÀ® ÄÄÆ÷³ÍÆ®µéÀº ´Ü¼øÈ÷ AWT ÄÄÆ÷³ÍÆ®µéÀ» ´Ù½Ã ±¸ÇöÇÏ´Â µ¥ ±×Ä¡Áö ¾Ê°í ±â´ÉÀ» ´ëÆø °³¼±ÇÏ¿´À¸¸ç »Ó¸¸ ¾Æ´Ï¶ó À¯¿ëÇÑ »õ·Î¿î ÄÄÆ÷³ÍÆ®µéÀ» ¿©·µ ¼±º¸¿´½À´Ï´Ù. AWT ÄÄÆ÷³ÍÆ®¿¡ ´ëÀÀÇÏ´Â ÄÄÆ÷³ÍÆ®µéµµ ´ëºÎºÐ AWT ÄÄÆ÷³ÍÆ®ÀÇ »ç¿ë ¹æ¹ýÀ» Áö¿øÇϱä ÇÏÁö¸¸ ¿Ü¾çµµ ¸¹ÀÌ ´Þ¶óÁö°í ¸Þ½îµåµéÀÌ ¸¹ÀÌ Ãß°¡µÇ¾úÀ¸¹Ç·Î JDK 1.2 API ¹®¼­¸¦ ²À ÀоîºÁ¾ß ÇÕ´Ï´Ù.

»õ·Î Ãß°¡µÈ ÄÄÆ÷³ÍÆ®µéÀ» °£´ÜÈ÷ ¼Ò°³ÇÏ¸é ´ÙÀ½°ú °°½À´Ï´Ù.

¡Ü JCheckBoxMenuItem, JRadioButtonMenuItem : üũ¹Ú½º ȤÀº ¶óµð¿À ¹öÆ° Çü½ÄÀÇ ¸Þ´º Ç׸ñ ÄÄÆ÷³ÍÆ®

<±×¸²> JCheckBoxMenuItem°ú JRadioButtonMenuItem

¡Ü JRadioButton : ¶óµð¿À ¹öÆ° ÄÄÆ÷³ÍÆ®. AWT ÄÄÆ÷³ÍÆ®¿¡¼­´Â CheckboxGroup Ŭ·¡½º¸¦ »ç¿ëÇÏ¿© Checkbox ÄÄÆ÷³ÍÆ®·Î ¶óµð¿À ¹öÆ°À» ±¸ÇöÇÏÁö¸¸ ½ºÀ® ÄÄÆ÷³ÍÆ®¿¡¼­´Â º°µµÀÇ ¶óµð¿À ¹öÆ° ÄÄÆ÷³ÍÆ®¸¦ Á¦°ø

<±×¸²> JRadioButton

¡Ü JColorChooser : ¿øÇÏ´Â »ö±òÀ» Á÷Á¢ º¸¸é¼­ ¼±ÅÃÇÒ ¼ö ÀÖ´Â ´ëÈ­»óÀÚ ÄÄÆ÷³ÍÆ®

<±×¸²> JColorChooser

¡Ü JComboBox : JComboBox ÄÄÆ÷³ÍÆ®´Â AWT ÄÄÆ÷³ÍÆ®ÀÇ Choice¿¡ ÇØ´çÇÏ´Â ½ºÀ® ÄÄÆ÷³ÍÆ®. ¿©·¯ °³ ÁßÀÇ Çϳª¸¦ ¼±ÅÃÇÒ ¼öµµ ÀÖÀ¸¸ç ÇöÀç ¼±ÅÃµÈ ¹®ÀÚ¿­À» ÆíÁýÇÒ ¼öµµ ÀÖ½À´Ï´Ù.

<±×¸²> JComboBox

¡Ü JFileChooser : AWT ÄÄÆ÷³ÍÆ®ÀÇ FileDialog¿¡ ÇØ´çÇÏ´Â ½ºÀ® ÄÄÆ÷³ÍÆ®ÀÔ´Ï´Ù. ÆÄÀÏÀ» ¼±ÅÃÇÒ ¶§ »ç¿ëÇϸç À̹ÌÁö ÆÄÀÏÀÇ °æ¿ì ¹Ì¸® º¸±â ±â´ÉÀ» Áö¿øÇÕ´Ï´Ù.

<±×¸²> JFileChooser

¡Ü JInternalFrame : ÄÁÅ×ÀÌ³Ê ³»ºÎ¿¡ ÇÁ·¹ÀÓÀ» ¸¸µé ¼ö ÀÖ´Â ÄÄÆ÷³ÍÆ®

<±×¸²> JInternalFrame

¡Ü JProgressBar : ÁøÇà »óȲÀ» ±×·¡ÇÈÀ¸·Î º¸¿©ÁÖ´Â ÄÄÆ÷³ÍÆ®

<±×¸²> JProgressBar

¡Ü JSlider : ´«±ÝÀ̳ª Å©±â¸¦ ³ªÅ¸³»´Â ÄÄÆ÷³ÍÆ®.

<±×¸²> JSlider

¡Ü JSplitPane : À©µµ¿ì ³»ºÎ¸¦ ºÐÇÒÇÏ¿© »ç¿ëÇÒ ¼ö ÀÖ´Â ÄÄÆ÷³ÍÆ®

<±×¸²> JSplitPane ÄÄÆ÷³ÍÆ® »ç¿ë ¿¹Á¦

¡Ü JTabbedPane : ¿©·¯ °³ÀÇ À©µµ¿ì Áß ¼±ÅÃµÈ ÇÑ È­¸é¸¸ º¸¿©ÁÖ´Â À©µµ¿ì·Î AWTÀÇ CardLayoutÀ» »ç¿ëÇÏ¿© ±¸ÇöÇÑ À©µµ¿ìµé°ú À¯»çÇÑ ±â´ÉÀ» °¡Áö°í ÀÖ½À´Ï´Ù.

<±×¸²> JTabbedPane

¡Ü JTable : Ç¥¸¦ Ç¥ÇöÇÏ´Â ÄÄÆ÷³ÍÆ®

<±×¸²> JTable

¡Ü JTextPane : ¼­½ÄÀ» °¡Áø ÅؽºÆ®¿Í À̹ÌÁö¸¦ »ç¿ëÇÏ¿© Ç¥ÇöÇÒ ¼ö ÀÖ´Â ¹®¼­ â ÄÄÆ÷³ÍÆ®. ¼­½Ä ÀÖ´Â ¹®¼­, RTF ¹®¼­, HTML ¹®¼­ µîÀ» Ç¥ÇöÇÒ ¼ö ÀÖ½À´Ï´Ù.

<±×¸²> JTextPane

¡Ü JPasswordField : Æнº¿öµå¸¦ ÀԷ¹޴ ÅؽºÆ®Çʵå ÄÄÆ÷³ÍÆ®

<±×¸²> JPasswordField

¡Ü JToolBar : ¸í·É ¾ÆÀÌÄÜ ¹Ú½º ÄÄÆ÷³ÍÆ®·Î ¸Þ´º ¾Æ·¡¿¡ ºÙÀ» ¼öµµ ÀÖ°í ÇÁ·¹ÀÓÀ¸·ÎºÎÅÍ ¶¼³¾ ¼öµµ ÀÖ½À´Ï´Ù.

<±×¸²> JToolBar

¡Ü JToolTip : ¸¶¿ì½º ¿òÁ÷ÀÓ¿¡ µû¶ó ÇöÀç ¸¶¿ì½º°¡ À§Ä¡ÇÑ ºÎºÐ¿¡ ´ëÇÑ Ç³¼± µµ¿ò¸»À» Á¦°øÇÏ´Â ÄÄÆ÷³ÍÆ®

<±×¸²> JToolTip

¡Ü JTree : ³ª¹« ¸ð¾çÀÇ °èÃþ ±¸Á¶¸¦ Ç¥ÇöÇÏ´Â ÄÄÆ÷³ÍÆ®

<±×¸²> JTree

1.2 AWT Äڵ带 ½ºÀ® ÄÚµå·Î ¹Ù²Ù±â

½ºÀ® ÄÄÆ÷³ÍÆ®¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀº ±âº»ÀûÀÎ ¸Þ½îµåµéÀÇ °æ¿ì¿¡´Â AWTÀÇ ´ëÀÀÇÏ´Â ÄÄÆ÷³ÍÆ®µéÀÇ »ç¿ë¹ý°ú °ÅÀÇ µ¿ÀÏÇÕ´Ï´Ù. ±×·¡¼­, AWT ÄÄÆ÷³ÍÆ®µé·Î ÀÛ¼ºÇÑ ÇÁ·Î±×·¥µéÀ» ½ºÀ® ÄÄÆ÷³ÍÆ®¸¦ »ç¿ëÇϵµ·Ï ¹Ù²Ù´Â µ¥¿¡´Â ¸î °¡Áö Á¡¸¸ ¿°µÎ¿¡ µÎ¸é Å« ¾î·Á¿òÀº ¾ø½À´Ï´Ù.

ù°, java.awt, java.awt.event ÆÐÅ°Áö¿Í ´õºÒ¾î ½ºÀ® ÄÄÆ÷³ÍÆ® Ŭ·¡½ºµéÀÌ Æ÷ÇÔµÈ ÆÐÅ°Áöµé Áï, javax.swing ÆÐÅ°Áö¿Í javax.swing.event ÆÐÅ°Áö¸¦ ÀÓÆ÷Æ®ÇÕ´Ï´Ù.

µÑ°, °¢ AWT ÄÄÆ÷³ÍÆ® Ŭ·¡½º À̸§µéÀ» ´ëÀÀÇÏ´Â ½ºÀ® ÄÄÆ÷³ÍÆ® Ŭ·¡½º À̸§À¸·Î º¯°æÇÕ´Ï´Ù. ¸¹Àº °æ¿ì¿¡´Â Ŭ·¡½º À̸§ ¾Õ¿¡ 'J'¸¸ ºÙ¿©ÁÖ¸é µÉ °ÍÀÔ´Ï´Ù.

¼Â°, ¸Þ½îµåµé Áß À̸§À̳ª »ç¿ë¹ýÀÌ ´Ù¸¥ °æ¿ì¿¡´Â ã¾Æ¼­ º¯°æÇØÁÖ¾î¾ß ÇÕ´Ï´Ù.

°£´ÜÇÑ ¿¹Á¦¸¦ ¹Ù²Ù¾î º¸¸é¼­ ½ºÀ® ÄÄÆ÷³ÍÆ®¸¦ »ç¿ëÇÒ ¶§ AWT ÄÄÆ÷³ÍÆ®¿Í ´Ù¸£°Ô ó¸®ÇØ¾ß ÇÏ´Â ºÎºÐµéÀÌ ¹«¾ùÀÎÁö ¤¾îº¾½Ã´Ù.

¸ÕÀú °£´ÜÇÑ AWT ¿¹Á¦ÀÔ´Ï´Ù.

	import java.awt.*;
	import java.awt.event.*;
	
	public class AWTComponent extends Frame 
				implements ActionListener { // ¹öÆ°ÀÇ ½ÇÇà À̺¥Æ® ó¸®
		// ÇÁ·¹ÀÓÀÇ »ý¼ºÀÚ
		AWTComponent(String title) {
			super(title);
			// ¸Þ´º¹Ù »ý¼º
			MenuBar menuBar=new MenuBar();
			// ÆÄÀÏ ¸Þ´º¸¦ »ý¼ºÇÏ¿© ¸Þ´º¹Ù¿¡ Ãß°¡
			Menu fileMenu = new Menu("File");
			menuBar.add(fileMenu);
			// ÆÄÀÏ ¸Þ´ºÀÇ °¢ ¸Þ´º Ç׸ñÀ» »ý¼º
			fileMenu.add(new MenuItem("Open"));
			fileMenu.add(new MenuItem("Save"));
			fileMenu.addSeparator();
			fileMenu.add(new MenuItem("Print"));
			fileMenu.addSeparator();
			// Á¾·á ¸Þ´º Ç׸ñÀº ´ÜÃàÅ°¸¦ ¸¸µé°í ½ÇÇà À̺¥Æ® ó¸® °´Ã¼¸¦ µî·ÏÇÑ´Ù.
			MenuItem exitItem = new MenuItem("Exit", new MenuShortcut('X'));
			fileMenu.add(exitItem);
			exitItem.setActionCommand("Exit");
			exitItem.addActionListener(this);
			// ¸Þ´º¹Ù¸¦ ÇÁ·¹ÀÓ¿¡ Ãß°¡ÇÑ´Ù.
			setMenuBar(menuBar);
	
			// ¹öÆ°°ú ÅؽºÆ®¿µ¿ªÀ» °¢°¢ ÇÁ·¹ÀÓ¿¡ Ãß°¡ÇÑ´Ù.
			Button button=new Button("Exit");
			add(button, "South");
			button.addActionListener(this);
			TextArea text=new TextArea();
			add(text, "Center");
			text.setText("AWT ÄÄÆ÷³ÍÆ®¸¦ »ç¿ëÇÏ¿´½À´Ï´Ù.");
		}
	
		// main() ¸Þ½îµå
		public static void main(String args[]) {
			AWTComponent frame=new AWTComponent("AWT UI Program");
			frame.setSize(300, 300);
			frame.setVisible(true);
		}
	
		// ½ÇÇà À̺¥Æ®°¡ ¹ß»ýÇϸé Á¾·áÇÑ´Ù.
		public void actionPerformed(ActionEvent evt) {
			String cmd=evt.getActionCommand();
			if (cmd.equals("Exit"))
				System.exit(0);
		}
	}
<¿¹Á¦> AWTComponent ÇÁ·Î±×·¥

ÀÌ ÇÁ·Î±×·¥À» À§ÀÇ ¹æ¹ý¿¡ µû¶ó ½ºÀ® ÄÄÆ÷³ÍÆ® ÇÁ·Î±×·¥À¸·Î º¯°æÇÏ¸é ´ÙÀ½°ú °°ÀÌ ¹Ù²Ü ¼ö ÀÖ½À´Ï´Ù. º¼µåü·Î Ç¥½ÃµÈ ºÎºÐÀÌ º¯°æµÈ ºÎºÐµéÀÔ´Ï´Ù.

	import java.awt.*;
	import java.awt.event.*;
	import javax.swing.*;
	
	public class SwingComponent extends JFrame 
				implements ActionListener {
		// »ý¼ºÀÚ
		SwingComponent(String title) {
			super(title);
	
			JMenuBar menuBar=new JMenuBar();
			JMenu fileMenu = new JMenu("File");
			menuBar.add(fileMenu);
			fileMenu.add(new JMenuItem("Open"));
			fileMenu.add(new JMenuItem("Save"));
			fileMenu.addSeparator();
			fileMenu.add(new JMenuItem("Print"));
			fileMenu.addSeparator();
			JMenuItem exitItem = new JMenuItem("Exit", 'X');
			fileMenu.add(exitItem);
			exitItem.setActionCommand("Exit");
			exitItem.addActionListener(this);
			setJMenuBar(menuBar);
	
			JButton button=new JButton("Exit");
			getContentPane( ).add(button, "South");
			button.addActionListener(this);
	
			JTextArea text=new JTextArea();
			getContentPane( ).add(text, "Center");
			text.setText("Swing ÄÄÆ÷³ÍÆ®¸¦ »ç¿ëÇÏ¿´½À´Ï´Ù.");
		}
	
		// main ¸Þ½îµå
		public static void main(String args[]) {
			SwingComponent frame=new SwingComponent("Swing UI Program");
			frame.setSize(300, 300);
			frame.setVisible(true);
		}
	
		public void actionPerformed(ActionEvent evt) {
			String cmd=evt.getActionCommand();
			if (cmd.equals("Exit"))
				System.exit(0);
		}
	}
<¿¹Á¦> ½ºÀ® ÄÄÆ÷³ÍÆ®·Î º¯°æµÈ ÄÚµå

getContentPane()

AWT ÄÄÆ÷³ÍÆ®¸¦ »ç¿ëÇÏ´Â Äڵ带 ½ºÀ® ÄÄÆ÷³ÍÆ®¸¦ »ç¿ëÇϵµ·Ï º¯°æÇÑ SwinComponent.java Äڵ带 º¸¸é À§¿¡¼­ Á¦½ÃµÈ ¼¼ °¡Áö ±ÔÄ¢À» µû¸£Áö ¾ÊÀº °ÍÀº °ÅÀÇ ¾ø½À´Ï´Ù. ÇÏÁö¸¸ Á¶±Ý ´õ ÀÚ¼¼È÷ º¸¸é Áß¿äÇÑ ´Ù¸¥ Á¡ÀÌ ÀÖ½À´Ï´Ù. ¹Ù·Î ¹öÆ°°ú ÅؽºÆ®¿µ¿ªÀ» ÇÁ·¹ÀÓ¿¡ Ãß°¡ÇÏ´Â Äڵ忡¼­ getContentPane()À̶ó´Â Á¶±Ý »ý¼ÒÇÑ ¸Þ½îµå¸¦ È£ÃâÇÕ´Ï´Ù.

getContentPane( ).add(button, "South");

AWT¿Í ¸¶Âù°¡Áö·Î ½ºÀ®¿¡µµ ÄÄÆ÷³ÍÆ®µéÀ» Ãß°¡ÇÏ¿© ¹èÄ¡ÇÒ ¼ö ÀÖ´Â ÄÁÅ×ÀÌ³Ê ¿ªÇÒÀ» ÇÏ´Â ÄÄÆ÷³ÍÆ®µéÀÌ Á¸ÀçÇÕ´Ï´Ù.

JFrame, JApplet, JDialog, JWindow°¡ ¹Ù·Î ½ºÀ® ÄÄÆ÷³ÍÆ®µéÀÇ ÄÁÅ×ÀÌ³Ê ÄÄÆ÷³ÍÆ®µéÀÔ´Ï´Ù. À̵é ÄÁÅ×ÀÌ³Ê ÄÄÆ÷³ÍÆ®µéÀº ½ÇÁ¦·Î´Â ÀÚ½Ä À©µµ¿ì ÄÄÆ÷³ÍÆ®µéÀ» ¹èÄ¡ÇÏ°í °ü¸®ÇÏ´Â ÀÏÀ» º°µµÀÇ ÄÁÅ×ÀÌ³Ê ÄÄÆ÷³ÍÆ®¿¡°Ô À§ÀÓÇÏ´Â ¹æ½ÄÀ» äÅÃÇÏ°í ÀÖ½À´Ï´Ù. ±×·¡¼­ À©µµ¿ì ÄÄÆ÷³ÍÆ®µéÀ» ÀÌµé ½ºÀ® ÄÁÅ×ÀÌ³Ê ÄÄÆ÷³ÍÆ®¿¡ Ãß°¡ÇÒ ¶§¿¡´Â º¸ÀÌÁö ¾Ê´Â ÀÌ º°µµÀÇ ÄÁÅ×ÀÌ³Ê ÄÄÆ÷³ÍÆ®¿¡°Ô Ãß°¡ÇØ¾ß ÇÕ´Ï´Ù. ÀÌ ÄÁÅ×ÀÌ³Ê ÄÄÆ÷³ÍÆ®¸¦ contentPaneÀ̶ó°í ÇÕ´Ï´Ù. contentPane °´Ã¼¿¡°Ô ¿äûÇØ¾ß °Í¿¡´Â ÄÄÆ÷³ÍÆ® Ãß°¡»Ó¸¸ ¾Æ´Ï¶ó ÄÄÆ÷³ÍÆ®µéÀÇ ·¹À̾ƿô °ü¸®ÀÚ ÁöÁ¤µµ Æ÷ÇԵ˴ϴÙ. Áï, ½ºÀ® ÄÁÅ×ÀÌ³Ê ÄÄÆ÷³ÍÆ®ÀÇ ·¹À̾ƿô °ü¸®ÀÚ¸¦ FlowLayoutÀ¸·Î º¯°æÇÏ°í ½Í´Ù¸é ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î »ç¿ëÇÏ¸é µË´Ï´Ù.

	Container contentPane = getContentPane( );
	contentPane.setLayout(new FlowLayout( ));
	contentPane.add(new JButton("¹öÆ°"));

½ºÀ® ÄÄÆ÷³ÍÆ®¿Í AWT ÄÄÆ÷³ÍÆ®¸¦ ¼¯À¸¸é?

½ºÀ® ÄÄÆ÷³ÍÆ®¿Í AWT ÄÄÆ÷³ÍÆ®¸¦ ¼¯¾î¼­ »ç¿ëÇÏ¸é ¾î¶»°Ô µÉ±î¿ä? óÀ½ ½ºÀ® ÄÄÆ÷³ÍÆ®¸¦ »ç¿ëÇÑ´Ù¸é Àͼ÷ÇØÁ® ÀÖ´ø AWT ÄÄÆ÷³ÍÆ®¸¦ °è¼Ó »ç¿ëÇÏ°í AWT ÄÄÆ÷³ÍÆ®°¡ ¾ø´Â ºÎºÐ¸¸ ½ºÀ® ÄÄÆ÷³ÍÆ®¸¦ »ç¿ëÇϸé Æí¸®ÇÒ °Í °°½À´Ï´Ù.

ÇÏÁö¸¸, ÀÌ°ÍÀº °ï¶õÇÑ ¹®Á¦¸¦ ¾È°í ÀÖ½À´Ï´Ù. AWT ÄÄÆ÷³ÍÆ®µéÀº ºÒÅõ¸íÇÑ À©µµ¿ì ½Ã½ºÅÛÀÇ ÄÄÆ÷³ÍÆ®µéÀ» ºô¾î »ç¿ëÇÏ´Â ÄÄÆ÷³ÍÆ®µéÀÌ°í ½ºÀ® ÄÄÆ÷³ÍÆ®µéÀº ÀÚ¹Ù·Î Á÷Á¢ ·»´õ¸µÇÏ°í ±â´ÉÀ» ó¸®ÇÏ´Â Åõ¸íÇÑ ÄÄÆ÷³ÍÆ®µéÀÔ´Ï´Ù. À̵é AWT ÄÄÆ÷³ÍÆ®¿Í ½ºÀ® ÄÄÆ÷³ÍÆ®¸¦ ÇÔ²² ¹èÄ¡ÇÒ °æ¿ì ÄÄÆ÷³ÍÆ®¸¦ Ãß°¡ÇÑ ¼ø¼­¿¡ °ü°è¾øÀÌ Ç×»ó AWT ÄÄÆ÷³ÍÆ®µéÀÌ ½ºÀ® ÄÄÆ÷³ÍÆ®¸¦ µ¤¾î½á¹ö¸®°Ô µË´Ï´Ù.

´ÙÀ½ ±×¸²Àº °£´ÜÇÑ ¿¹¸¦ º¸¿©ÁÝ´Ï´Ù. ¼¼ °³ÀÇ ¹öÆ° Áß µÎ °³(¶óº§ÀÌ Light¿Í Light2)´Â JButtonÀ̸ç Çϳª(¶óº§ÀÌ Heavy)´Â ButtonÀÔ´Ï´Ù. ¹öÆ°À» Ãß°¡ÇÑ ¼ø¼­´Â Light, Heavy, Light2 ¼ø¼­ÀÌÁö¸¸ ½ÇÁ¦·Î µð½ºÇ÷¹À̵DZâ´Â Heavy ·¹À̺íÀ» °¡Áø AWT Button ÄÄÆ÷³ÍÆ®°¡ µÎ ½ºÀ® ¹öÆ° ÄÄÆ÷³ÍÆ®µé À§¿¡ ³ªÅ¸³ª°Ô µË´Ï´Ù.

¼¯¾î¼­ »ç¿ëÇÏÁö ¾Ê´Â °ÍÀÌ ÃÖ¼±À̶ó´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù.

<±×¸²> AWT ÄÄÆ÷³ÍÆ®¿Í ½ºÀ® ÄÄÆ÷³ÍÆ®¸¦ ÇÔ²² »ç¿ëÇÑ ¿¹


1.3 ½ºÀ® ÄÁÅ×À̳ʵé

¸ðµç ½ºÀ® ÄÄÆ÷³ÍÆ®°¡ °æ·® ÄÄÆ÷³ÍÆ®ÀÎ °ÍÀº ¾Æ´Õ´Ï´Ù. ½ºÀ® ÄÄÆ÷³ÍÆ®¸¦ ´ã´Â ´ÙÀ½ ³× °¡Áö ½ºÀ® ÄÁÅ×ÀÌ³Ê Å¬·¡½º´Â Áß·®ÀÎ AWT ÄÄÆ÷³ÍÆ® À§¿¡ Ưº°ÇÑ ¼³°è¸¦ ÇÏ¿© ½ºÀ® ÄÄÆ÷³ÍÆ®µéÀ» Ãß°¡ÇÒ ¼ö ÀÖµµ·Ï ÇÏ¿´½À´Ï´Ù.

Áß·® ÄÄÆ÷³ÍÆ®ÀÎ ³× °¡Áö ½ºÀ® ÄÁÅ×ÀÌ³Ê ÄÄÆ÷³ÍÆ®´Â ´ÙÀ½°ú °°½À´Ï´Ù.

¡Ü JFrame : Frame Ŭ·¡½º¸¦ »ó¼ÓÇÏ¿© ½ºÀ® ÄÄÆ÷³ÍÆ®¸¦ Ãß°¡ÇÒ ¼ö ÀÖ°Ô ÇØÁÝ´Ï´Ù.

¡Ü JDialog : Dialog Ŭ·¡½º¸¦ »ó¼ÓÇÏ¿© ¿©·¯ °¡Áö ´ëÈ­ »óÀÚ¸¦ ½ºÀ® ÄÄÆ÷³ÍÆ®µé·Î ±¸ÇöÇÏ°Ô ÇØÁÝ´Ï´Ù.

¡Ü JWindow : Window Ŭ·¡½º¸¦ »ó¼ÓÇÏ¿© ½ºÀ® ÄÄÆ÷³ÍÆ®¸¦ Ãß°¡ÇÒ ¼ö ÀÖ°Ô ÇØÁÝ´Ï´Ù.

¡Ü JApplet : Applet Ŭ·¡½º¸¦ »ó¼ÓÇÏ¿© ¾ÖÇø´¿¡ ½ºÀ® ÄÄÆ÷³ÍÆ®¸¦ Ãß°¡ÇÒ ¼ö ÀÖ°Ô ÇØÁÝ´Ï´Ù. ½ºÀ® ÄÄÆ÷³ÍÆ®¸¦ »ç¿ëÇÏ´Â ¾ÖÇø´À» ÀÛ¼ºÇÒ ¶§¿¡´Â ¹Ýµå½Ã Applet Ŭ·¡½º°¡ ¾Æ´Ï¶ó JApplet Ŭ·¡½º¸¦ »ó¼ÓÇÏ¿© ¸¸µé¾î¾ß ÇÔÀ» Àؾ´Â ¾ÈµË´Ï´Ù.

ÀÌµé ³× °¡Áö ½ºÀ® ÄÁÅ×ÀÌ³Ê Å¬·¡½ºµéÀº ¸ðµÎ RootPaneContainer¶ó´Â °øÅëÀÇ ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ¿© ½ºÀ® ÄÄÆ÷³ÍÆ®¸¦ Ãß°¡Çϵµ·Ï ¼³°èµÇ¾ú½À´Ï´Ù. ÀÌ ¿Ü¿¡µµ ÇÁ·¹ÀÓ ¾È¿¡ ³»ºÎ ÇÁ·¹ÀÓ À©µµ¿ì¸¦ ±¸ÇöÇÏ°Ô ÇØÁÖ´Â ½ºÀ® ÄÁÅ×À̳ÊÀÎ JInternalFrame Ŭ·¡½ºµµ µ¿ÀÏÇÑ ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ¿© ½ºÀ® ÄÁÅ×À̳ʵéÀº ÅëÀÏµÈ ¹æ½ÄÀ¸·Î ½ºÀ® ÄÄÆ÷³ÍÆ®µéÀ» Ãß°¡, °ü¸®ÇÕ´Ï´Ù.

<±×¸²> ½ºÀ® ÄÁÅ×ÀÌ³Ê Å¬·¡½º °èÃþ »ó¼Ó ±¸Á¶

RootPaneContainer ÀÎÅÍÆäÀ̽º´Â JRootPane °´Ã¼¸¦ »ç¿ëÇÏ¿© ½ºÀ® ÄÄÆ÷³ÍÆ®µéÀ» °ü¸®ÇÏ°Ô ÇϹǷÎ, JRootPane °´Ã¼¸¦ »ìÆ캸¸é ½ºÀ® ÄÁÅ×À̳ʰ¡ ½ºÀ® ÄÄÆ÷³ÍÆ®¸¦ °ü¸®ÇÏ´Â ±âº»ÀûÀÎ ¹æ¹ýÀ» ÀÌÇØÇÒ ¼ö ÀÖ½À´Ï´Ù.

JRootPaneÀº ½ºÀ® ÄÁÅ×À̳ʵéÀÇ ¸ðµç µ¿ÀÛÀ» À§ÀÓ¹ÞÀº ½ºÀ® ÄÄÆ÷³ÍÆ®ÀÌ¸ç ´ÙÀ½ ³× °¡Áö ¼­·Î ´Ù¸¥ ±â´ÉÀ» ÇÏ´Â ÄÄÆ÷³ÍÆ®µé·Î ±¸¼ºµË´Ï´Ù.

<±×¸²> JRootPaneÀ» ±¸¼ºÇÏ´Â À©µµ¿ìµéÀÇ À©µµ¿ì °èÃþ ±¸Á¶

¡Ü ÀÚ½Ä ÄÄÆ÷³ÍÆ® À©µµ¿ì¸¦ ´ã´Â ºÎºÐ (contentPane) : ¸ðµç ÀÚ½Ä ½ºÀ® ÄÄÆ÷³ÍÆ® À©µµ¿ìµéÀÇ ºÎ¸ð À©µµ¿ì°¡ µË´Ï´Ù. rootPane¿¡ Á÷Á¢ ÀÚ½Ä ÄÄÆ÷³ÍÆ®¸¦ Ãß°¡Çؼ­´Â ¾ÈµÇ¸ç ¹Ýµå½Ã contentPane¿¡ Ãß°¡ÇØ¾ß ÇÕ´Ï´Ù.

¡Ü Åõ¸íÇÑ ºÎºÐ (glassPane) : ÀÌ ºÎºÐÀº Àüü ½ºÀ® ÄÁÅ×À̳ÊÀÇ ¸ðµç À̺¥Æ®¸¦ °¡·Îç ¼ö ÀÖµµ·Ï Ưº°È÷ ¼³°èµÈ Åõ¸íÇÑ ÄÄÆ÷³ÍÆ®ÀÔ´Ï´Ù. Ç×»ó Á¸ÀçÇÏ¸ç ´ëºÎºÐÀÇ °æ¿ì º¸ÀÌÁö ¾Ê½À´Ï´Ù.

¡Ü ÃþÀ» ±¸¼ºÇÏ´Â ºÎºÐ (layeredPane) : JLayeredPane Ŭ·¡½ºÀÇ ÀνºÅϽº °´Ã¼ÀÌ¸ç ¿©·¯ ½ºÀ® ÄÁÆ÷³ÍÆ®µéÀÌ °ãÃÄÁú ¶§ °¢ ÄÄÆ÷³ÍÆ®ÀÇ »óÇÏ À§Ä¡¸¦ °áÁ¤ÇÕ´Ï´Ù. Ç×»ó Á¸ÀçÇϸç contentPane°ú menuBar´Â ÀÌ ÄÄÆ÷³ÍÆ®ÀÇ ÀÚ½Ä À©µµ¿ì·Î ±¸¼ºµË´Ï´Ù.

¡Ü ¸Þ´º¹Ù (menuBar) : JMenuBar Ŭ·¡½ºÀÇ ÀνºÅϽº °´Ã¼À̸ç Ç×»ó Á¸ÀçÇÏÁö´Â ¾Ê½À´Ï´Ù.

1.4 BoxLayout »ç¿ëÇϱâ

javax.swing ÆÐÅ°Áö¿¡´Â ½ºÀ® ÄÄÆ÷³ÍÆ® ¿Ü¿¡µµ ¹Ý°¡¿î Ŭ·¡½º°¡ Çϳª µé¾î ÀÖ½À´Ï´Ù. »õ·Î¿î ·¹À̾ƿô °ü¸®ÀÚÀÎ BoxLayout Ŭ·¡½ºÀÔ´Ï´Ù. ¹°·Ð ½ºÀ® ÄÄÆ÷³ÍÆ®µéÀ» ±âÁ¸ÀÇ ·¹À̾ƿô °ü¸®ÀÚ¸¦ »ç¿ëÇÏ¿© ·¹À̾ƿôÇÏ´õ¶óµµ ¾î·Á¿òÀÌ ¾ø±ä ÇÏÁö¸¸ BoxLayout Ŭ·¡½º´Â Á»´õ Æí¸®ÇÏ°í ¿øÇÏ´Â ¸ð¾çÀ¸·Î ÄÄÆ÷³ÍÆ®¸¦ ·¹À̾ƿôÇÒ ¼ö ÀÖ°Ô ÇØÁÖ´Â Àç°£µÕÀÌ Å¬·¡½ºÀÔ´Ï´Ù.

BoxLayout Ŭ·¡½º´Â °¡·Î ¹æÇâ, ȤÀº ¼¼·Î ¹æÇâÀ¸·Î ÄÄÆ÷³ÍÆ®¸¦ Á¤·Ä½ÃÅ°´Âµ¥, ¿¹¸¦ µé¾î Æгο¡ µÎ °³ÀÇ ¹öÆ°À» Â÷·Ê·Î °¡·Î ¹æÇâÀ¸·Î Ãß°¡½ÃÅ°´Â °æ¿ì¿£ ´ÙÀ½°ú °°ÀÌ BoxLayoutÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

	JPanel panel = new JPanel();
	// ù ¹ø° ÀÎÀÚ¿¡´Â ·¹À̾ƿôÇÒ ´ë»ó ÄÄÆ÷³ÍÆ®¸¦,
	// µÎ ¹ø° ÀÎÀÚ¿¡´Â °¡·Î ¹æÇâ Á¤·ÄÀÇ °æ¿ì¿¡´Â BoxLayout.X_AXIS,
	// ¼¼·Î ¹æÇâ Á¤·ÄÀÇ °æ¿ì¿¡´Â BoxLayout.Y_AXIS¸¦ ÁöÁ¤ÇÑ´Ù.
	panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
	panel.add(new JButton("¹öÆ° 1"));
	panel.add(new JButton("¹öÆ° 2"));

BoxLayoutÀ» ¼¼·Î ¹æÇâÀ¸·Îµµ Á¤·ÄÀÌ °¡´ÉÇÑ FlowLayoutÀ¸·Î »ý°¢Çϸé ÀÌÇØ°¡ ½±½À´Ï´Ù. ÇÏÁö¸¸ BoxLayoutÀÇ ´É·ÂÀº FlowLayoutÀÇ ´Ü¼øÇÑ È®ÀåÀÌ ¾Æ´Ï¶ó ¼¶¼¼ÇÑ Á¦¾î±îÁö °¡´ÉÇÏ°Ô ÇØÁÝ´Ï´Ù. BoxLayoutÀÇ ·¹À̾ƿô ±â´ÉÀ» µ½±â À§ÇØ Box¶ó´Â º°µµÀÇ Å¬·¡½º°¡ Á¸ÀçÇÕ´Ï´Ù.

Box Ŭ·¡½º´Â ¸î °³ÀÇ static ¸Þ½îµå¸¦ Á¦°øÇÏ¿© ÄÄÆ÷³ÍÆ® »çÀÌ¿¡ °£°ÝÀ» Áְųª ºó ºÎºÐÀ» ä¿ï ¼ö ÀÖ´Â º¸ÀÌÁö ¾Ê´Â ÄÄÆ÷³ÍÆ®µéÀ» ¸¸µé¾îÁÝ´Ï´Ù.

¸Þ½îµå À̸§

¿ªÇÒ

createGlue( )

'glue'´Â ¾Æ±³¸¦ ¶æÇÕ´Ï´Ù. ÀÌ ¾Æ±³´Â °¢ ÄÄÆ÷³ÍÆ®¸¦ Àû´çÇÑ Å©±â·Î ¹èÄ¡ÇÏ°í ³µÀ» ¶§ ³²´Â ºÎºÐÀ» ä¿ì´Â ÀÏÀ» ÇÕ´Ï´Ù. ÀÌ º¸ÀÌÁö ¾Ê´Â ¾Æ±³ ÄÄÆ÷³ÍÆ®¸¦ ¸¸µå´Â BoxÀÇ Å¬·¡½ºÀÇ static ¸Þ½îµåµéÀº ´ÙÀ½ ¼ÂÀ¸·Î, Box.createHorizontalGlue() ¸Þ½îµå´Â °¡·Î ¹æÇâ, Box.createVerticalGlue() ¸Þ½îµå´Â ¼¼·Î ¹æÇâ, Box.createGlue() ¸Þ½îµå´Â °¡·Î, ¼¼·Î ¹æÇâÀÇ ¾Æ±³ ÄÄÆ÷³ÍÆ®¸¦ ¸¸µì´Ï´Ù.

createHorizontalGlue( )

createVerticalGlue( )

createRigidArea( )

'rigid area'´Â ¸» ±×´ë·Î °íÁ¤µÈ ¿µ¿ªÀ» ³ªÅ¸³À´Ï´Ù. ÀÌ °íÁ¤ ¿µ¿ªÀº ÁöÁ¤ÇÑ Å©±â¸¸Å­ ÀÚ¸®¸¦ Â÷ÁöÇÏ°Ô µË´Ï´Ù.

createHorizontalStrut( )

'strut'Àº ¹öÆÀ¸ñÀ̶ó´Â ¶æÀ» °¡Áö°í ÀÖ½À´Ï´Ù. ÀÌ ¹öÆÀ¸ñÀº °¡·Î ȤÀº ¼¼·Î ¹æÇâÀÇ °íÁ¤ °£°ÝÀ» ÁöÁ¤ÇÕ´Ï´Ù. ÇÑÂÊ ¹æÇ⸸ ÀÖ´Â °íÁ¤ ¿µ¿ª°ú ºñ½ÁÇÏÁö¸¸, ´Ù¸¥ Á¡Àº RigidAreaÀÇ °æ¿ì °¡·Î, ¼¼·Î ¸ðµÎ °íÁ¤µÈ Å©±â¸¦ ÁöÁ¤ÇÏÁö¸¸ StrutÀÇ °æ¿ì¿¡´Â °¡·Î, ȤÀº ¼¼·Î ¼ººÐ¸¸ °íÁ¤ Å©±â¸¦ ÁöÁ¤Çϱ⠶§¹®¿¡ ÁöÁ¤µÇÁö ¾ÊÀº ºÎºÐ, Áï HorizontalStrutÀÇ °æ¿ì ¼¼·Î ¹æÇâÀº ¸¶Ä¡ Glueó·³ ä¿ì´Â ¿ªÇÒÀ» ¼öÇàÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. ÁöÁ¤µÇÁö ¾ÊÀº ÇÑ ¹æÇâÀÇ ±æÀÌ°¡ Á¦ÇÑÀÌ ¾ø±â ¶§¹®¿¡ º¹ÀâÇÑ ·¹À̾ƿô¿¡ »ç¿ëÇϱ⿡´Â ¿¹ÃøÀÌ ¾î·Á¿öÁö´Â ¹®Á¦°¡ ÀÖ½À´Ï´Ù. ÀÌ °æ¿ì¿¡´Â RigidArea¸¦ ÇÑÂÊ ±æÀ̸¦ 0À¸·Î ÇÏ¿© »ç¿ëÇÏ´Â °ÍÀÌ º¸´Ù ¿¹Ãø °¡´ÉÇÏ°í È®½ÇÇÑ ´ë¾ÈÀÌ µÉ °ÍÀÔ´Ï´Ù.

createVerticalStrut( )

	import java.awt.*;
	import java.awt.event.*;
	import javax.swing.*;
	
	class BoxExample extends JFrame {
		public BoxExample(String title) {
			super(title);
			Container contentPane = getContentPane();
			// µÎ °³ÀÇ ÆгÎÀº ¼¼·Î ¹æÇâÀ¸·Î ½×´Â´Ù.
			contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
	
			JPanel panel1 = new JPanel();
			// °¡·Î ¹æÇâÀÇ ·¹À̾ƿô
			panel1.setLayout(new BoxLayout(panel1, BoxLayout.X_AXIS));
			panel1.setBorder(BorderFactory.createTitledBorder("Panel 1"));
			panel1.add(Box.createHorizontalGlue());
			panel1.add(new JButton("O K"));
			panel1.add(Box.createRigidArea(new Dimension(5, 0)));
			panel1.add(new JButton("Cancel"));
	
			JPanel panel2 = new JPanel();
			panel2.setLayout(new BoxLayout(panel2, BoxLayout.X_AXIS));
			panel2.setBorder(BorderFactory.createTitledBorder("Panel 2"));
			panel2.add(new JButton("O K"));
			panel2.add(Box.createVerticalStrut(100));
			panel2.add(new JButton("Cancel"));
	
			contentPane.add(panel1);
			contentPane.add(panel2);
			validate();
			setSize(300, 200);
			setVisible(true);
		}
	
		public static void main(String args[]) {
			new BoxExample("Box Layout Example Program");
		}
	}
<¿¹Á¦> BoxLayoutÀ» »ç¿ëÇÑ ·¹À̾ƿô ¿¹Á¦ ÇÁ·Î±×·¥

<±×¸²> BoxLayoutÀ» »ç¿ëÇÑ ·¹À̾ƿô

·è¾ØÇÊ

½ºÀ® ÄÄÆ÷³ÍÆ®µéÀº AWT ÄÄÆ÷³ÍÆ®¿Í ´Þ¸® ¼ø¼öÇÏ°Ô ÀÚ¹Ù ÄÚµå·Î ¸¸µé¾îÁø ÄÄÆ÷³ÍÆ®µéÀ̱⠶§¹®¿¡ ¿©·¯ °¡Áö »õ·Î¿î ÀÚ¹Ù¸¸ÀÇ ±â´ÉÀ» ¼³°è ¶§ºÎÅÍ °í·ÁÇÏ¿© Ãß°¡ÇÒ ¼ö ÀÖ¾ú½À´Ï´Ù.

·è¾ØÇÊ(Look and Feel)Àº ½ºÀ® ÄÄÆ÷³ÍÆ®µéÀÇ ÀüüÀûÀÎ ¿Ü¾ç°ú ´À³¦À» ÁöÁ¤Çϴ Ŭ·¡½ºÀÔ´Ï´Ù. ·è¾ØÇÊÀ» »ç¿ëÇÏ¸é µ¿ÀÏÇÑ ½ºÀ® ÄÄÆ÷³ÍÆ®µéÀÌ ÇöÀç ÁöÁ¤µÈ ·è¾ØÇÊ¿¡ µû¶ó ÀüÇô ´Ù¸¥ ´À³¦À» ÁÖ°Ô µË´Ï´Ù.

´ÙÀ½ ±×¸²Àº ·è¾ØÇÊ¿¡ µû¶ó ¼­·Î ´Ù¸¥ ¸ð½ÀÀ¸·Î ³ªÅ¸³ª´Â µ¿ÀÏÇÑ ½ºÀ® ÄÄÆ÷³ÍÆ®µéÀ» º¸¿©ÁÝ´Ï´Ù.

<±×¸²> ÀÚ¹Ù ·è¾ØÇÊ

<±×¸²> À©µµ¿ì ·è¾ØÇÊ

<±×¸²> ¸ðƼÇÁ ·è¾ØÇÊ

º°µµ·Î ·è¾ØÇÊÀ» ÁöÁ¤ÇÏÁö ¾ÊÀ¸¸é ÀÚ¹Ù ·è¾ØÇÊÀÌ ±âº»À¸·Î ÁöÁ¤µË´Ï´Ù. ·è¾ØÇÊÀ» ÁöÁ¤ÇÒ ¶§¿¡´Â ´ÙÀ½°ú °°ÀÌ UIManager Ŭ·¡½º¸¦ »ç¿ëÇÕ´Ï´Ù.

	try {
		UIManager.setLookAndFeel(
			UIManager.getCrossPlatformLookAndFeelClassName());
	} catch (Exception e) {
		System.err.println("Cannot set look and feel:"+e.getMessage());
	}

UIManager Ŭ·¡½ºÀÇ getCrossPlatformLookAndFeelClassName() ¸Þ½îµå´Â ÀÚ¹Ù ·è¾ØÇÊ Å¬·¡½º À̸§À» ¸®ÅÏÇÕ´Ï´Ù. getSystemLookAndFeelClassName() ¸Þ½îµå´Â ÇöÀç ÀÚ¹Ù ½ºÀ® ÄÄÆ÷³ÍÆ®°¡ ½ÇÇàµÇ°í Àִ ȯ°æ¿¡ µû¶ó ´Ù¸¥ Ŭ·¡½º À̸§À» ¸®ÅÏÇÕ´Ï´Ù. Áï, ¸¶ÀÌÅ©·Î¼ÒÇÁÆ® À©µµ¿ì ½Ã½ºÅÛ¿¡¼­ ½ÇÇàµÇ°í ÀÖ´Ù¸é À©µµ¿ì ·è¾ØÇÊ Å¬·¡½º À̸§À» ¸®ÅÏÇÏ°í, À¯´Ð½ºÀÇ X À©µµ¿ì ½Ã½ºÅÛ¿¡¼­ ½ÇÇàµÇ°í ÀÖ´Ù¸é ¸ðƼÇÁ ·è¾ØÇÊ Å¬·¡½º À̸§À» ¸®ÅÏÇÒ °ÍÀÔ´Ï´Ù.


´ÙÁß ¾²·¹µå ȯ°æÀÇ ½ºÀ® ÄÄÆ÷³ÍÆ®

AWT ÄÄÆ÷³ÍÆ®¿Í´Â ´Þ¸® ½ºÀ® ÄÄÆ÷³ÍÆ®µéÀ» ´ÙÁß ¾²·¹µå ȯ°æ¿¡¼­ »ç¿ëÇÒ ¶§¿¡´Â ÁÖÀÇÇØ¾ß ÇÒ »çÇ×ÀÌ ÀÖ½À´Ï´Ù. AWT ÄÄÆ÷³ÍÆ®¿¡¸¸ Àͼ÷ÇØÀÖ´ø µ¶ÀÚ¶ó¸é ¸¹ÀÌ ³î¶ö °ÍÀÔ´Ï´Ù.

"ÀÏ´Ü ½ºÀ® ÄÄÆ÷³ÍÆ®°¡ ±¸ÇöµÈ ´ÙÀ½¿¡´Â ½ºÀ® ÄÄÆ÷³ÍÆ®ÀÇ »óŸ¦ º¯°æÇѴٰųª º¯°æµÈ »óÅ¿¡ µû¶ó ¾î¶² ÀÏÀ» ¼öÇàÇÏ°íÀÚ ÇÒ ¶§¿¡´Â ¹Ýµå½Ã À̺¥Æ® ó¸® ¾²·¹µå¿¡¼­ ¼öÇàÇØ¾ß ÇÕ´Ï´Ù."

½ºÀ® ÄÄÆ÷³ÍÆ®´Â setVisible(true), show(), pack() µîÀÇ ¸Þ½îµå¸¦ »ç¿ëÇÏ¸é ±¸ÇöµË´Ï´Ù. ÀÌ ¶§, ±¸ÇöµÈ´Ù´Â Ç¥ÇöÀº È­¸é¿¡ º¸¿©Á®¼­ paint() ¸Þ½îµå°¡ ÀÚµ¿À¸·Î È£ÃâµÇ°í À̺¥Æ®¸¦ ¹ÞÀ» Áغñ°¡ µÈ´Ù´Â ¶æÀÔ´Ï´Ù. ±×·± Àǹ̿¡¼­ ´Ü¼øÈ÷ ÄÄÆ÷³ÍÆ® ¾È¿¡ Æ÷ÇÔµÈ ÄÄÆ÷³ÍÆ®µéÀ» ¿øÇÏ´Â Å©±â·Î ¹èÄ¡½ÃÅ°´Â Àϸ¸ ÇÏ´Â pack() ¸Þ½îµå°¡ È£ÃâµÉ ¶§¿¡µµ ½ºÀ® ÄÄÆ÷³ÍÆ®µéÀÌ ±¸ÇöµÈ´Ù´Â Á¡Àº ²À ±â¾ïÇØ¾ß ÇÕ´Ï´Ù. ÀÌ·± ¸Þ½îµåµéÀ» È£ÃâÇÑ ´ÙÀ½¿¡´Â ÇØ´çÇÏ´Â ½ºÀ® ÄÄÆ÷³ÍÆ®¿Í ±× ¾È¿¡ Æ÷ÇÔµÈ ½ºÀ® ÄÄÆ÷³ÍÆ®µé¿¡ setText(), getText() µî°ú °°ÀÌ ÄÄÆ÷³ÍÆ®ÀÇ »óŸ¦ º¯°æÇÏ´Â ¸Þ½îµå¸¦ È£ÃâÇϸé À̺¥Æ® ó¸® ¾²·¹µå¿Í °æÀï Á¶°Ç¿¡ ºüÁú À§ÇèÀÌ ÀÖ½À´Ï´Ù.

À̺¥Æ® ó¸® ¾²·¹µå´Â AWT À©µµ¿ì ½Ã½ºÅÛÀÇ À̺¥Æ®¸¦ ó¸®ÇÏ´Â ¾²·¹µå·Î paint() ¸Þ½îµå¸¦ ºñ·ÔÇÏ¿© actionPerformed() µî ¸ðµç À̺¥Æ® ó¸® ¸Þ½îµå¸¦ È£ÃâÇÏ´Â º°µµÀÇ ¾²·¹µåÀÔ´Ï´Ù. ÀÌ À̺¥Æ® ó¸® ¾²·¹µå¿¡°Ô ¿øÇÏ´Â ÀÏÀ» ¼öÇàÇϵµ·Ï ¿äûÇÏ·Á¸é javax.swing ÆÐÅ°ÁöÀÇ SwingUtilities Ŭ·¡½º°¡ Á¦°øÇÏ´Â static ¸Þ½îµåÀÎ invokeLater() ȤÀº invokeAndWait() ¸Þ½îµå¸¦ »ç¿ëÇØ¾ß ÇÕ´Ï´Ù.

	public static void invokeLater(Runnable obj);
	public static void invokeAndWait(Runnable obj)
		throws InterruptedException, InvocationTargetException;

ÀÌ µÎ ¸Þ½îµå´Â invokeLater() ¸Þ½îµå°¡ ½ÇÇàÀ» ¿äûÇÑ ´ÙÀ½ ¹Ù·Î ´ÙÀ½À¸·Î ½ÇÇàÀÌ ³Ñ¾î°¡´Â ´ë½Å¿¡ invokeAndWait() ¸Þ½îµå´Â ÁöÁ¤ÇÑ RunnableÀÇ run() ¸Þ½îµå ½ÇÇàÀÌ Á¾·áÇÒ ¶§±îÁö ±â´Ù¸°´Ù´Â Á¡À» Á¦¿ÜÇÏ¸é µ¿ÀÏÇÑ ¿ªÇÒÀ» ÇÕ´Ï´Ù.

ÀÌ ¸Þ½îµåµéÀ» »ç¿ëÇغ¾½Ã´Ù. JFrameÀÌ È­¸é¿¡ º¸¿©Áö°í ³­ ´ÙÀ½¿¡ ÇÁ·¹ÀÓ¿¡ ÀÖ´Â JTextFieldÀÇ °ªÀ» º¯°æÇÒ ¶§¿¡´Â ´ÙÀ½°ú °°ÀÌ ÇÒ ¼ö ÀÖ½À´Ï´Ù.

	JFrame frame = new JFrame("test frame");
	...
	frame.setVisible(true); 
	// ¿©±âºÎÅÍ´Â GUI »óŸ¦ º¯°æ½ÃÅ°´Â ¸Þ½îµå¸¦ »ç¿ëÇؼ­´Â ¾ÈµÈ´Ù.
	Runnable doSetText = new Runnable() {
		public void run() {
			text.setText("Setting text after setVisible");
		}
	};
	// ³ªÁß¿¡ À̺¥Æ® ¾²·¹µå¿¡¼­ ÇØ´ç ÀÛ¾÷À» ¼öÇàÇϵµ·Ï ¿äûÇÑ´Ù.
	SwingUtilities.invokeLater(doSetText);

1.5 ½ºÀ® ´ÙÁß ¹®¼­ ÀÎÅÍÆäÀ̽º

´ÙÁß ¹®¼­ ÀÎÅÍÆäÀ̽º(MDI, Multiple Document Interface)´Â ÇϳªÀÇ ÁÖ ÇÁ·¹ÀÓ À©µµ¿ì ¾È¿¡ ¿©·¯ °³ÀÇ ¹®¼­ À©µµ¿ì¸¦ °ü¸®ÇÒ ¼ö ÀÖ´Â ÀÎÅÍÆäÀ̽º·Î ´ëºÎºÐÀÇ À©µµ¿ì¿ë ¿öµåÇÁ·Î¼¼¼­³ª ½ºÇÁ·¹µå½ÃÆ® ÇÁ·Î±×·¥µéÀÌ Á¦°øÇÏ´Â ÀÎÅÍÆäÀ̽ºÀÔ´Ï´Ù.

ÀÚ¹Ù ½ºÀ® ÄÄÆ÷³ÍÆ®´Â JInternalFrame ÄÄÆ÷³ÍÆ® Ŭ·¡½º¸¦ Á¦°øÇÏ¿© ÇÁ·¹ÀÓ ¾È¿¡ ³»ºÎ ÇÁ·¹ÀÓ À©µµ¿ì ÄÄÆ÷³ÍÆ®¸¦ ±¸ÇöÇÒ ¼ö ÀÖµµ·Ï Áö¿øÇÕ´Ï´Ù. AWT À©µµ¿ì ½Ã½ºÅÛ¿¡¼­´Â °¡´ÉÇÏÁö ¾Ê´ø ´ÙÁß ¹®¼­ ÀÎÅÍÆäÀ̽º°¡ JInternalFrame ÄÄÆ÷³ÍÆ®¸¦ »ç¿ëÇÏ¿© ¼Õ½±°Ô ±¸ÇöÇÒ ¼ö ÀÖ°Ô µÈ °ÍÀÔ´Ï´Ù.

1.5.1 JLayeredPaneÀÇ Ãþµé

JRootPane ÄÄÆ÷³ÍÆ®´Â ³»ºÎ¿¡ Ãß°¡ÇÒ ½ºÀ® ÄÄÆ÷³ÍÆ®ÀÇ »óÇÏ Æ÷°³ÁüÀ» ó¸®ÇÒ ¼ö ÀÖ´Â JLayeredPane ÄÄÆ÷³ÍÆ®¸¦ °¡Áý´Ï´Ù. °¢ ½ºÀ® ÄÄÆ÷³ÍÆ®´Â ÀÚ½ÅÀÌ ¼ÓÇÑ Ãþ¿¡ µû¶ó »óÇÏ À§Ä¡°¡ Á¤ÇØÁö´Âµ¥ ÀÌ ÃþÀÇ °ªÀº Á¤¼ö·Î ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. ³ôÀº Á¤¼ö°ªÀ» °¡Áø Ãþ¿¡ ¼ÓÇÑ ÄÄÆ÷³ÍÆ®°¡ ³·Àº Á¤¼ö°ªÀ» °¡Áø Ãþ¿¡ ¼ÓÇÑ ÄÄÆ÷³ÍÆ®º¸´Ù À­ÂÊ¿¡ À§Ä¡ÇÕ´Ï´Ù. ´ÙÀ½ ¿¹Á¦¿¡¼­ ¹öÆ°Àº ·¹ÀÌºíº¸´Ù À§¿¡ À§Ä¡ÇÒ °ÍÀÔ´Ï´Ù.

	JFrame frame = new JFrame();
	JLayeredPane layeredPane = frame.getLayeredPane();
	JButton button = new JButton("¹öÆ°");
	JLabel label = new JLabel("·¹À̺í");
	// ¹öÆ°Àº 20ÀÇ °ªÀ» °¡Áø Ãþ¿¡ ¼ÓÇÑ´Ù.
	layeredPane.add(button, new Integer(20));
	// ·¹À̺íÀº 10ÀÇ °ªÀ» °¡Áø Ãþ¿¡ ¼ÓÇÑ´Ù.
	layeredPane.add(label, new Integer(10));

ÀÌ¿Í °°ÀÌ Á÷Á¢ Á¤¼ö°ªÀ» ÁöÁ¤ÇÏ¿© °¢ ÄÄÆ÷³ÍÆ®µéÀÌ ¼ÓÇÒ ÃþÀ» ÁöÁ¤ÇÒ ¼öµµ ÀÖ°ÚÁö¸¸ JLayeredPane¿¡¼­´Â ÀÚÁÖ »ç¿ëµÇ´Â ÃþÀ» ¹Ì¸® ´Ù¼¸ °¡Áö·Î ºÐ·ùÇÏ¿© »ó¼ö·Î Á¦°øÇÕ´Ï´Ù. ´ëºÎºÐÀÇ °æ¿ì¿¡´Â ÀÌ »ó¼ö°ªµéÀ» »ç¿ëÇÏ°Ô µÉ °ÍÀÔ´Ï´Ù.

¡Ü JLayeredPane.DEFAULT_LAYER : ±âº» Ãþ. Ưº°È÷ ÃþÀ» ÁöÁ¤ÇÏÁö ¾ÊÀ¸¸é ¸ðµÎ ±âº»°ªÀ¸·Î ÀÌ Ãþ¿¡ ¼ÓÇÏ°Ô µË´Ï´Ù. ÀϹÝÀûÀÎ °æ¿ì¿¡´Â ÀÌ ÃþÀ» »ç¿ëÇÕ´Ï´Ù.

¡Ü JLayeredPane.PALETTE_LAYER : ±âº» Ãþ À§¿¡ À§Ä¡ÇÏ´Â ÃþÀÔ´Ï´Ù. ´Ù¸¥ ÄÄÆ÷³ÍÆ®µéº¸´Ù À­ÂÊ¿¡ À§Ä¡ÇÏ°Ô ÇØÁֹǷΠ¸Þ´º¿¡¼­ ºÐ¸®µÈ Åø¹Ù µî¿¡ »ç¿ëÇÕ´Ï´Ù.

¡Ü JLayeredPane.MODAL_LAYER : ¸ð´ú ´ëÈ­»óÀÚ¿¡ ÁÖ·Î »ç¿ëÇÏ´Â ÃþÀÔ´Ï´Ù.

¡Ü JLayeredPane.POPUP_LAYER : ÅøÆÁÀ̳ª ÄÞº¸»óÀÚ µîÀÇ Æ˾÷ À©µµ¿ì¸¦ ³ªÅ¸³»´Â µ¥ ÁÖ·Î »ç¿ëÇÏ´Â ÃþÀÔ´Ï´Ù.

¡Ü JLayeredPane.DRAG_LAYER : ¾î¶² ÄÄÆ÷³ÍÆ®¸¦ ¸¶¿ì½º·Î µå·¡±ëÇÒ ¶§¿¡´Â µå·¡±ëµÇ´Â ÄÄÆ÷³ÍÆ®°¡ ´Ù¸¥ ¸ðµç ÄÄÆ÷³ÍÆ®µéº¸´Ù ¾ÕÀ¸·Î ³ª¿Íº¸¿©¾ß ÇÕ´Ï´Ù. ÄÄÆ÷³ÍÆ®¸¦ µå·¡±ëÇÏ´Â µµÁß¿¡ »ç¿ëµÇ´Â ÃþÀÔ´Ï´Ù.

´ëºÎºÐÀÇ ÄÄÆ÷³ÍÆ®µéÀº ÃþÀ» º°µµ·Î ÁöÁ¤ÇÏÁö ¾ÊÀ» ¶§ »ç¿ëµÇ´Â ±âº» Ãþ(DEFAULT_LAYER)¿¡ ¼ÓÇÏ°Ô µË´Ï´Ù. °°Àº Ãþ¿¡ ¼ÓÇÑ ÄÄÆ÷³ÍÆ®µé °£¿¡µµ ¼­·ÎÀÇ À§Ä¡ °ü°è¸¦ ÁöÁ¤ÇÒ ¼ö Àִµ¥ JLayeredPane Ŭ·¡½ºÀÇ moveToFront(), moveToBack(), setPosition() ¸Þ½îµå´Â °¢°¢ °°Àº Ãþ ¾È¿¡¼­ ÄÄÆ÷³ÍÆ®µé °£ÀÇ »ó´ë À§Ä¡¸¦ º¯°æ½Ãŵ´Ï´Ù.

7.2 JInternalFrame »ç¿ë ¹æ¹ý

ÀÌÁ¦ JInternalFrame ÄÄÆ÷³ÍÆ® »ç¿ë¹ýÀ» ¾Ë¾Æº¾½Ã´Ù. ¿©·¯ °³ÀÇ ³»ºÎ ÇÁ·¹ÀÓ ÄÄÆ÷³ÍÆ®´Â ¾î¶² Ãþ¿¡ ¼ÓÇÏ¿© ±× Ãþ¿¡ µû¶ó Æ÷°³ÁüÀÌ °áÁ¤µË´Ï´Ù. ³»ºÎ ÇÁ·¹ÀÓ ÄÄÆ÷³ÍÆ®¸¦ Ãß°¡ÇÒ ÄÄÆ÷³ÍÆ®´Â JLayeredPaneÀ» »ó¼ÓÇÏ´Â JDesktopPane ÄÄÆ÷³ÍÆ®ÀÔ´Ï´Ù. JDesktopPane Ŭ·¡½º´Â JLayeredPaneÀ» »ó¼ÓÇϸ鼭 JInternalFrame ÄÄÆ÷³ÍÆ®¸¸À» Àü´ãÇؼ­ °ü¸®Çϴ Ư¼öÇÑ ÄÄÆ÷³ÍÆ® Ŭ·¡½ºÀÔ´Ï´Ù.

´ÙÀ½ ¿¹Á¦ ÄÚµå´Â ³»ºÎ ÇÁ·¹ÀÓÀ» »ý¼ºÇؼ­ ÇÁ·¹ÀÓ¿¡ Ãß°¡ÇÏ´Â ¾ÆÁÖ °£´ÜÇÑ ÇÁ·Î±×·¥ÀÔ´Ï´Ù.

	import java.awt.*;
	import javax.swing.*;
	
	class IFrame {
		public static void main(String args[]) {
			// ÇÁ·¹ÀÓ »ý¼º
			JFrame frame = new JFrame("³»ºÎ ÇÁ·¹ÀÓ Å×½ºÆ® ÇÁ·Î±×·¥"); 
			// JDesktopPane »ý¼º
			JDesktopPane desktop = new JDesktopPane();
			// ³»ºÎ ÇÁ·¹ÀÓ »ý¼º
			JInternalFrame iframe
				= new JInternalFrame("ù ¹ø° ³»ºÎ ÇÁ·¹ÀÓ", 
					true /* Å©±âº¯°æ °¡´É */,
					true /* Á¾·á °¡´É */,
					true /* ÃÖ´ë Å©±â·Î °¡´É */,
					true /* ¾ÆÀÌÄÜÈ­ °¡´É */ ); 
			desktop.add(iframe); // JDesktopPane ÄÄÆ÷³ÍÆ®¿¡ ³»ºÎ ÇÁ·¹ÀÓ Ãß°¡
			// ÇÁ·¹ÀÓ À©µµ¿ìÀÇ contentPaneÀ» JDesktopPane ÄÄÆ÷³ÍÆ®·Î ÁöÁ¤
			frame.setContentPane(desktop);
			// ³»ºÎ ÇÁ·¹ÀÓÀÇ À§Ä¡¿Í Å©±â ÁöÁ¤
			iframe.setBounds(50, 50, 200, 100);
			iframe.setVisible(true); // JDK 1.3.xºÎÅÍ´Â ±âº»°ªÀÌ invisible. JDK 1.2.x¹öÀü±îÁö´Â ±âº»°ªÀÌ visible. 
			frame.setSize(300,300); // ÇÁ·¹ÀÓÀÇ Å©±â ÁöÁ¤
			frame.setVisible(true);
		}
	}
<¿¹Á¦> ³»ºÎ ÇÁ·¹ÀÓÀ» ¸¸µå´Â ¾ÆÁÖ °£´ÜÇÑ ÇÁ·Î±×·¥

<±×¸²> ù ¹ø° ³»ºÎ ÇÁ·¹ÀÓ À©µµ¿ì ÇÁ·Î±×·¥

7.3 ³»ºÎ ÇÁ·¹ÀÓÀÇ À©µµ¿ì À̺¥Æ® ó¸®

³»ºÎ ÇÁ·¹ÀÓÀ» ¾ÆÀÌÄÜÈ­Çϰųª Á¾·áÇÏ´Â µî À©µµ¿ì »óŸ¦ º¯È­½ÃÅ°¸é ÀÏ¹Ý À©µµ¿ìÀÇ WindowEvent À̺¥Æ®¿¡ ÇØ´çÇÏ´Â InternalFrameEvent À̺¥Æ®°¡ ¹ß»ýÇÕ´Ï´Ù. ÀÌ InternalFrameEvent¸¦ ó¸®ÇÏ·Á¸é InternalFrameListener ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇϰųª InternalFrameAdapter Ŭ·¡½º¸¦ »ó¼ÓÇÏ¸é µË´Ï´Ù. WindowEvent À̺¥Æ®¸¦ ó¸®ÇÏ´Â ¹æ¹ý°ú Å©°Ô ´Ù¸£Áö ¾Ê½À´Ï´Ù.

InternalFrameListener ÀÎÅÍÆäÀ̽º¿¡ Á¤ÀÇµÈ ³»ºÎ ÇÁ·¹ÀÓ À̺¥Æ® ó¸® ¸Þ½îµåµéÀº ´ÙÀ½°ú °°½À´Ï´Ù.

¨ç public void internalFrameActivated(InternalFrameEvent e) : ³»ºÎ ÇÁ·¹ÀÓÀÌ È°¼ºÈ­µÉ ¶§

¨è public void internalFrameClosed(InternalFrameEvent e) : ³»ºÎ ÇÁ·¹ÀÓÀÌ ´Ý°åÀ» ¶§

¨é public void internalFrameClosing(InternalFrameEvent e) : ³»ºÎ ÇÁ·¹ÀÓÀÌ ´Ý±æ ¶§

¨ê public void internalFrameDeactivated(InternalFrameEvent e) : ³»ºÎ ÇÁ·¹ÀÓÀÌ ºñÈ°¼ºÈ­µÉ ¶§

¨ë public void internalFrameDeiconified(InternalFrameEvent e) : ³»ºÎ ÇÁ·¹ÀÓÀÌ ¾ÆÀÌÄÜÈ­µÇ¾ú´Ù°¡ º¹±¸µÉ ¶§

¨ì public void internalFrameIconified(InternalFrameEvent e) : ³»ºÎ ÇÁ·¹ÀÓÀÌ ¾ÆÀÌÄÜÈ­µÉ ¶§

¨í public void internalFrameOpened(InternalFrameEvent e) : ³»ºÎ ÇÁ·¹ÀÓÀÌ ¿­¸± ¶§


2. ¸ð³ª¸®ÀÚ ±×¸®±â, ÀÚ¹Ù 2D

JDK 1.2 ¹öÀüÀÌ ³ª¿À±â Àü¿¡µµ ÀÚ¹Ù´Â ±×·¡ÇÈ ±â´ÉÀ» Á¦°øÇßÁö¸¸, Áö³ªÄ¡°Ô ±âº»ÀûÀÎ ±â´É¿¡ ÇÑÁ¤µÇ¾î ÀÚ¹Ù¸¦ »ç¿ëÇÑ °í±Þ ±×·¡ÇÈ ÇÁ·Î±×·¥Àº °ÅÀÇ ºÒ°¡´ÉÇß½À´Ï´Ù. ÇÏÁö¸¸ ÀÚ¹Ù 2 Áï, JDK 1.2ÀÇ µîÀå°ú ÇÔ²² ÀÌ·¯ÇÑ ºÒ¸¸À» °ÅÀÇ ÇؼÒÇÒ ¼ö ÀÖ°Ô µÇ¾ú½À´Ï´Ù. ÀÚ¹Ù 2¿¡ »õ·Î Æ÷ÇÔµÈ 2D ±â¼úÀº ±âÁ¸ ±×·¡ÇÈ ±â´ÉÀ» Å©°Ô È®Àå, °³¼±ÇÏ¿© µå·ÎÀ×, À̹ÌÁö ó¸®, ÅؽºÆ® ·»´õ¸µ, »ö±ò Á¤ÀÇ¿¡ À̸£±â±îÁö ±¤¹üÀ§ÇÑ ±â´ÉÀ» Á¦°øÇÕ´Ï´Ù.

<±×¸²> 2D¸¦ »ç¿ëÇÑ ±×·¡ÇÈ ÇÁ·Î±×·¥ ¿¹Á¦

2.1 ±×·¡ÇÈ ÄÁÅؽºÆ® - Graphics¿Í Graphics2D

±×¸²À» ±×¸®±â À§Çؼ­´Â ±×·¡ÇÈ ÀåÄ¡ ÄÁÅؽºÆ®¶ó´Â °ÍÀÌ ÇÊ¿äÇÕ´Ï´Ù. ÀÚ¹Ù¿¡¼­´Â java.awt ÆÐÅ°ÁöÀÇ Graphics Ŭ·¡½º¿¡¼­ ±×·¡ÇÈ ÀåÄ¡ ÄÁÅؽºÆ®¿Í ¿©·¯ °¡Áö ·»´õ¸µ¿¡ ÇÊ¿äÇÑ »óÅ Á¤º¸¸¦ ÀúÀåÇÏ´Â ±â´ÉÀ» Á¦°øÇÏ°í ÀÖ½À´Ï´Ù. µû¶ó¼­, ÀÚ¹Ù¿¡¼­ ±×¸²À» ±×¸± ¶§¿¡´Â ¹Ýµå½Ã Graphics °´Ã¼¿¡ ´ëÇÑ ÂüÁ¶¸¦ ±¸ÇØ¾ß ÇÕ´Ï´Ù.

Graphics °´Ã¼¿¡ ´ëÇÑ ÂüÁ¶´Â °¢ ÄÄÆ÷³ÍÆ®¿¡¼­ getGraphics() ¸Þ½îµå¸¦ È£ÃâÇÏ¿© ¾òÀ» ¼ö ÀÖÀ¸¸ç ÀÚ¹ÙÀÇ AWT ½Ã½ºÅÛÀÌ ÀÎÀÚ·Î Graphics °´Ã¼¿¡ ´ëÇÑ ÂüÁ¶¸¦ ÀÎÀÚ·Î ³Ñ°ÜÁÖ´Â paint() µîÀÇ ¸Þ½îµå ¾È¿¡¼­ ¹Ù·Î »ç¿ëÇÏ¸é µË´Ï´Ù.

Áï, JPanel ÄÄÆ÷³ÍÆ® ¾È¿¡ ¼±À» ±×À¸·Á¸é ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

	JPanel panel = new JPanel();
	Graphics g = panel.getGraphics();
	if (g==null) // ±×·¡ÇÈ ÄÁÅؽºÆ®¸¦ ¾ò´Â µ¥ ½ÇÆÐÇÑ °æ¿ì¸¦ ó¸®
		return; 
	try {
		g.drawLine(10, 10, 10, 50); // ÆгΠÀ§¿¡ ¼±À» ±×¸°´Ù.
	} finally { // getGraphics()·Î ¾òÀº ±×·¡ÇÈ ÄÁÅؽºÆ®´Â ¹Ýµå½Ã ¸®¼Ò½º ÇØÁö
		g.dispose();
	}

±×·¡ÇÈ ÄÁÅؽºÆ®´Â ½Ã½ºÅÛÀÌ Á¦°øÇÏ´Â ÇÑÁ¤µÈ ¸®¼Ò½ºÀ̹ǷΠ»ç¿ë ÈÄ¿¡´Â dispose()¸¦ ¸í½ÃÀûÀ¸·Î È£ÃâÇØÁà¾ß ÇÕ´Ï´Ù. ´Ù¸¸ paint()³ª update() ¸Þ½îµå¿¡¼­Ã³·³ AWT ½Ã½ºÅÛÀÌ ÀÎÀÚ·Î ³Ñ°ÜÁÖ´Â ±×·¡ÇÈ ÄÁÅؽºÆ®´Â dispose()¸¦ È£ÃâÇÒ ÇÊ¿ä°¡ ¾ø½À´Ï´Ù.

Graphics Ŭ·¡½º´Â ±âº»ÀûÀÎ µå·Î¿ì ±â´ÉÀ» Á¦°øÇÏ´Â ±×·¡ÇÈ ÄÁÅؽºÆ® Ŭ·¡½ºÀÔ´Ï´Ù. 2D ±×·¡ÇÈÀÇ È®ÀåµÈ ±â´ÉÀ» »ç¿ëÇϱâ À§Çؼ­´Â Graphics2D Ŭ·¡½º °´Ã¼¸¦ ±¸ÇØ¾ß Çϴµ¥, Graphics2D °´Ã¼¸¦ ±¸ÇÏ´Â ¹æ¹ýÀº ¾ÆÁÖ °£´ÜÇÕ´Ï´Ù.

¸ÕÀú Graphics °´Ã¼¸¦ ±¸ÇÑ ´ÙÀ½ ¸í½ÃÀûÀ¸·Î Çüº¯È¯À» ÇØÁÖ¸é µË´Ï´Ù. Áï, ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÕ´Ï´Ù.

	JPanel panel = new JPanel();
	// ¸í½ÃÀûÀ¸·Î Çü º¯È¯
	Graphics2D g2 = (Graphics2D) panel.getGraphics();
	if (g2==null) // ±×·¡ÇÈ ÄÁÅؽºÆ®¸¦ ¾ò´Â µ¥ ½ÇÆÐÇÑ °æ¿ì¸¦ ó¸®
		return; 
	try {
		BasicStroke stroke = new BasicStroke(10.0f);
		g2.setStroke(stroke);
		g2.drawLine(10, 10, 10, 50); // ÆгΠÀ§¿¡ ±½±â°¡ 10ÀÎ ¼±À» ±×¸°´Ù.
	} finally { // getGraphics()·Î ¾òÀº ±×·¡ÇÈ ÄÁÅؽºÆ®´Â ¹Ýµå½Ã ¸®¼Ò½º ÇØÁö
		g2.dispose();
	}

ÆÁ : ÀÚ¹Ù 2D ÇÁ·Î±×·¥À» »ç¿ëÇϸé À©µµ¿ì 95°¡ Á×¾î¿ä

À©µµ¿ì 95/98 ¿î¿µ üÁ¦ À§¿¡¼­ ÀÚ¹Ù 2D ¿¹Á¦ ÇÁ·Î±×·¥À» ½ÇÇà½ÃÅ°´Ù º¸¸é ÀÌÀ¯¾øÀÌ ½Ã½ºÅÛÀÌ ¸ÔÅëÀÌ µÇ´Â °æ¿ì°¡ °£È¤ ÀÖ½À´Ï´Ù. ÀÌ°ÍÀº JDK 1.2ÀÇ ¹ö±× ¶§¹®À̹ǷΠJDK 1.2.1 ¹öÀüÀ¸·Î ¾÷±×·¹À̵åÇϸé Á¶±Ý ´õ ¾ÈÁ¤µË´Ï´Ù. ÇÏÁö¸¸, ±×·¡µµ Á¾Á¾ ½Ã½ºÅÛÀÌ ´Ù¿îµÇ´Â °ÍÀ» ¸¸³ª°Ô µË´Ï´Ù. À̶§¿¡´Â »ç¿ëÇÏ´Â ºñµð¿À Ä«µå Á¦Á¶È¸»çÀÇ À¥ÆäÀÌÁö¸¦ ã¾Æ°¡ ÃֽŠ¹öÀüÀÇ ºñµð¿À Ä«µå µå¶óÀ̹ö¸¦ ´Ù¿î·ÎµåÇÏ¿© ¼³Ä¡Çϸé Á¶±Ý °³¼±µË´Ï´Ù.

2D ±×·¡ÇÈ ±â´ÉÀÌ ¸¶ÀÌÅ©·Î¼ÒÇÁÆ® À©µµ¿ì ¿î¿µ üÁ¦¿¡¼­´Â ¸¶ÀÌÅ©·Î¼ÒÇÁÆ® »çÀÇ DirectDraw ±â¼úÀ» »ç¿ëÇÏ¿© ±¸ÇöµÇ¾î Àֱ⠶§¹®¿¡ ¸¶ÀÌÅ©·Î¼ÒÇÁÆ® »ç·ÎºÎÅÍ ÇÑ±Û DirectX ÃֽŠ¹öÀüÀ» ´Ù¿î·ÎµåÇÏ¿© ¼³Ä¡Çϸé Á¶±Ý ´õ ¾ÈÁ¤µÉ ¼ö ÀÖ½À´Ï´Ù.

±ÛÀ» ¾µ ´ç½Ã(1999³â 4¿ù) ÇÊÀÚÀÇ ÄÄÇ»ÅÍ È¯°æÀº ÆæƼ¾ö 75MHz, ÁÖ ¸Þ¸ð¸® 32MBÀε¥ ¸Þ¸ð¸® ºÎÁ·°ú ºñµð¿À Ä«µåÀÇ ¹®Á¦ µîÀÌ º¹ÇÕÀûÀ¸·Î ¾ôÇô ¾ÆÁ÷µµ JDK¿¡ Æ÷ÇԵǾî ÀÖ´Â ÀÚ¹Ù 2D ¿¹Á¦ ÇÁ·Î±×·¥°ú ½ºÀ® ¿¹Á¦ ÇÁ·Î±×·¥À» Á¦´ë·Î ½ÇÇà½ÃÅ°Áö ¸øÇß½À´Ï´Ù. Áö±ÝÀº ¾÷±×·¹À̵åÇßÁö¸¸, ¼ÒÇÁÆ®¿þ¾îÀÇ ¹ßÀüÀÌ ¿ä±¸ÇÏ´Â Çϵå¿þ¾îÀÇ ºñ¿ëÀ» ÂѾư¡´Â ÁöºÒÇÏ´Â °ÍÀÌ ±âºÐ ÁÁÀº Àϸ¸Àº ¾Æ´Ï´õ±º¿ä.


2.2 µµÇü ±×¸®±â

2D ±×·¡ÇÈ ±â´ÉÀ» »ç¿ëÇÏ¿© ±×¸²À» ±×·Áº¾½Ã´Ù. ±×¸²À» ±×¸± ¶§¿¡´Â µµÇüÀÇ ¸ð¾ç°ú ½ºÆ®·ÎÅ©, ä¿ò µîÀÇ ¿ä¼Ò°¡ ÇÊ¿äÇÕ´Ï´Ù.

2.2.1 µµÇüÀÇ ¸ð¾ç

¸ÕÀú 2D ±×·¡ÇÈ¿¡¼­´Â ±×·ÁÁú µµÇüÀÇ ÀϹÝÀûÀÎ ¸ð¾çÀ» Á¤ÀÇÇÏ´Â Shape ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÕ´Ï´Ù. ÀÌ Shape ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ´Â ¿©·¯ °¡Áö µµÇü Ŭ·¡½ºµéÀÌ java.awt ÆÐÅ°Áö¿Í java.awt.geom ÆÐÅ°Áö¿¡ Á¤ÀÇ°¡ µÇ¾î ÀÖ½À´Ï´Ù.

⼗ GeneralPath - ÀϹÝÀûÀÎ ±âÇÏÇÐÀû µµÇü

⼗ Line2D - 2D API¸¦ »ç¿ëÇؼ­ ±×¸± ¼ö ÀÖ´Â ¼±. Line2D.Float ¹× Line2D.Double¿¡ ´ëÇÑ ºÎ¸ð Ŭ·¡½º

⼗ Rectangle - Á÷»ç°¢ÇüÀ» Á¤ÀÇÇÏ´Â java.awt Ŭ·¡½º

⼗ RectangularShape - Á÷»ç°¢ÇüÀ¸·Î µÑ·¯½Î¿©Áú ¼ö ÀÖ´Â µµÇü. Arc2D, Ellipse2D, Rectangle2D, RoundRectangle2DÀÇ ºÎ¸ð Ŭ·¡½º

⼗ Polygon - ´Ù°¢ÇüÀ» Á¤ÀÇÇÏ´Â java.awt Ŭ·¡½º

⼗ CubicCurve2D - 3Â÷ ÆĶó¹ÌÅÍ Ä¿ºêÀÇ ÀϺκÐ. CubicCurve2D.Float ¹× CubicCurve2D.DoubleÀÇ ºÎ¸ð Ŭ·¡½º

⼗ QuadCurve2D - 2Â÷ ÆĶó¹ÌÅÍ Ä¿ºêÀÇ ÀϺκÐ. QuadCurve2D.Float ¹× QuardCurve2D.Double¿¡ ´ëÇÑ ºÎ¸ð Ŭ·¡½º

⼗ Area - ´Ù¸¥ µµÇü °´Ã¼µé·Î ±¸¼ºµÈ ÀÓÀÇÀÇ ¿µ¿ª

À̸§ÀÌ 2D·Î ³¡³ª´Â µµÇü Ŭ·¡½ºµéÀº ³»ºÎ Ŭ·¡½º·Î °¢°¢ Float¿Í DoubleÀ» °¡Áö°í ÀÖÀ¸¸ç À̵é Áß Çϳª¸¦ ÅëÇØ °´Ã¼¸¦ »ý¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù. Double Ŭ·¡½º¸¦ »ç¿ëÇϸé Floatº¸´Ù Á»´õ ¼¶¼¼ÇÏ°Ô µµÇüÀ» Á¤ÀÇÇÒ ¼ö ÀÖÁö¸¸ ¼Óµµ°¡ ´À·ÁÁö´Â °ÍÀ» °¨¼öÇØ¾ß ÇÕ´Ï´Ù. °¡·Î, ¼¼·Î 10ÀÇ Å©±â¸¦ °¡Áö°í ÁÂÇ¥°¡ (0, 0)ÀÎ 2Â÷¿ø »ç°¢Çü °´Ã¼´Â ´ÙÀ½°ú °°ÀÌ »ý¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù.

	Rectangle2D rect = new Rectangle2D.Float(0.0f, 0.0f, 10.0f, 10.0f);

2.2.2 ½ºÆ®·ÎÅ©¿Í ä¿ò ¼Ó¼º

½ºÆ®·ÎÅ©(Stroke)´Â µµÇüÀÇ ¿Ü°û¼±À» ±×¸®´Â µ¥ »ç¿ëµÇ´Â ¿©·¯ °¡Áö ¼Ó¼ºµéÀ» ³ªÅ¸³»´Â Ç¥ÇöÀÔ´Ï´Ù. ÁÖ·Î µÎ²²³ª Á¡¼± ÆÐÅÏ, ¼±µéÀÌ ¸¸³¯ ¶§ÀÇ Ã³¸®, ¼±ÀÇ ³¡ ºÎºÐ ó¸® µîÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·¡ÇÈ ÄÁÅؽºÆ®¿¡ ½ºÆ®·ÎÅ©¸¦ ÁöÁ¤ÇÒ ¶§¿¡´Â setStroke() ¸Þ½îµå¸¦ »ç¿ëÇÕ´Ï´Ù. ´ÙÀ½Àº ¼± µÎ²²¸¦ 10À¸·Î ÁöÁ¤ÇÕ´Ï´Ù.

	
	BasicStroke stroke = new BasicStroke(10.0f);
	((Graphics2D) g).setStroke(stroke);

ä¿ò ¼Ó¼º(Paint)Àº µµÇüÀÇ ³»ºÎ¸¦ ä¿ì´Â ¹æ¹ýÀ» ¸»ÇÕ´Ï´Ù. µ¿ÀÏÇÑ »öÀ¸·Î ä¿ì´Â ¹æ¹ý°ú, ±×¶óµð¾ðÆ®¸¦ ÁÖ´Â ¹æ¹ý, ÁöÁ¤µÈ ÆÐÅÏÀ» »ç¿ëÇÏ¿© ä¿ì´Â ¹æ¹ý µîÀÌ Áö¿øµË´Ï´Ù. µ¿ÀÏÇÑ »öÀ¸·Î ä¿ï ¶§¿¡´Â setColor() ¸Þ½îµå¸¦ »ç¿ëÇÏ¸ç ´Ù¸¥ °æ¿ì¿¡´Â setPaint() ¸Þ½îµå¸¦ »ç¿ëÇÕ´Ï´Ù. ´ÙÀ½Àº ±×¶óµð¾ðÆ® ¹æ½ÄÀ¸·Î ä¿ò ¼Ó¼ºÀ» ÁöÁ¤ÇÏ¿© »ç°¢ÇüÀ» ±×¸®´Â ¿¹ÀÔ´Ï´Ù.

	GradientPaint gp = new GradientPaint(0.0f, 0.0f, Color.blue, 50.0f, 100.0f, Color.yellow);
	((Graphics2D) g).setPaint(gp);
	g.fillRect(0, 0, 50, 100);

2.2.3 µµÇü º¯È¯

2D ±×·¡ÇȺÎÅÍ´Â µµÇüÀÇ º¯È¯À» Áö¿øÇÕ´Ï´Ù. ´ëĪ º¯È¯, ȸÀü º¯È¯, °æ»ç Áֱ⠵îÀÇ º¯È¯À» ÇÒ ¼ö ÀÖ½À´Ï´Ù. 2D ±×·¡ÇÈÀº µµÇüÀÇ º¯È¯À» ±×·ÁÁú µµÇüÀÇ ¼Ó¼ºÃ³·³ »ç¿ëÇϵµ·Ï ¼³°èµÇ¾î ÀÖÀ¸¹Ç·Î µµÇüÀ» ±×¸®±â Àü¿¡ setTransform() ¸Þ½îµå¸¦ »ç¿ëÇÏ¿© º¯È¯ ¹æ½ÄÀ» ÁöÁ¤ÇØÁÖ¸é µË´Ï´Ù. ´ÙÀ½Àº »ç°¢ÇüÀ» 45µµ ȸÀü½ÃÅ°´Â º¯È¯ÀÔ´Ï´Ù.

	Rectangle2D rect = new Rectangle2D.Float(10.0, 10.0, 20.0, 30.0);
	AffineTransform rotate =
		AffineTransform.getRotateInstance(Math.PI/4.0, 0.0, 0.0);
	((Graphics2D) g).setTransform(rotate);
	((Graphics2D) g).fill();

2.2.4 µµÇü ±×¸®±â

µµÇüÀ» ½ÇÁ¦ ±×¸®·Á¸é ¸ÕÀú µµÇüÀÇ ¸ð¾ç°ú °¢ ¼Ó¼ºÀ» ÁöÁ¤ÇÑ ´ÙÀ½, µµÇü ³»ºÎ¸¦ ä¿ï °ÍÀÎÁö ¿©ºÎ¿¡ µû¶ó ¿Ü°û¼±¸¸ ±×¸®´Â draw() ¸Þ½îµå¿Í ³»ºÎ¸¦ ä¿ì´Â fill() ¸Þ½îµå¸¦ È£ÃâÇÏ¸é µË´Ï´Ù.

java.awt.Graphics Ŭ·¡½º´Â 2D ±â¼úÀÌ ¼Ò°³µÇ±â Àü¿¡ ³ª¿Â drawRect(), fillRect()¿Í °°Àº ¿©·¯ °¡Áö ¸Þ½îµåµéÀ» Á¦°øÇÕ´Ï´Ù. À̵éÀº ¸ðµÎ draw()³ª fill() ¸Þ½îµå¸¦ »ç¿ëÇؼ­µµ ±¸ÇöÇÒ ¼ö ÀÖ½À´Ï´Ù.

Áï,

	fillRect(10, 10, 20, 30);

°ú

	Rectangle2D rect = new Rectangle2D.Float(10.0, 10.0, 20.0, 30.0);
	((Graphics2D) g).fill();
Àº °ÅÀÇ °°Àº ÀÏÀ» ¼öÇàÇÏ°Ô µË´Ï´Ù.

2.3 2D µå·ÎÀ× ÇÁ·Î±×·¥ ¸¸µé±â

ÀÌÁ¦ µå·ÎÀ× ±â´ÉÀ» Àû¿ëÇÏ¿© ÇÁ·Î±×·¥À» ¸¸µé¾îº¼ ½Ã°£ÀÔ´Ï´Ù.

¸ð¾ç, ½ºÆ®·ÎÅ©, ä¿ò ¹æ½Ä, ±×¸®°í »ö±òÀ» ÁöÁ¤ÇÏ¿© ¸¶¿ì½º·Î ±×¸²À» ±×¸®µµ·Ï ÇÏ´Â °£´ÜÇÑ 2D µå·ÎÀ× ÇÁ·Î±×·¥À» ¸¸µé¾îº¾½Ã´Ù.

ÀÌ ÇÁ·Î±×·¥Àº Å©°Ô ³× °³ÀÇ Å¬·¡½º·Î ³ª´²º¼ ¼ö ÀÖ½À´Ï´Ù.

∙ Draw2D : JFrame Ŭ·¡½º¸¦ »ó¼ÓÇÑ ÁÖ Å¬·¡½º. µå·ÎÀ× ¼Ó¼ºÀ» ÁöÁ¤ÇÒ ¸Þ´º¸¦ Á¦°ø.

∙ DrawCanvas : JPanel Ŭ·¡½º¸¦ »ó¼ÓÇÏ¸ç ½ÇÁ¦ ±×¸²ÀÌ ±×·ÁÁö´Â ĵ¹ö½º ¿ªÇÒÀ» ÇÕ´Ï´Ù.

∙ DrawCanvas.UIController : Draw2D¿¡¼­ ¸Þ´º ¼±Åà À̺¥Æ®°¡ ¹ß»ýÇϸé ó¸®ÇÏ¿© ĵ¹ö½º¿¡ ±×·ÁÁú µå·ÎÀ× ¼Ó¼ºÀ» º¯°æÇÕ´Ï´Ù.

∙ DrawCanvas.MouseController : ĵ¹ö½º À§ÀÇ ¸¶¿ì½º ¿òÁ÷ÀÓÀ» ó¸®Çϴ Ŭ·¡½º.

¸ÕÀú ÁÖ Å¬·¡½ºÀÎ Draw2D Ŭ·¡½º´Â ´ÙÀ½°ú °°ÀÌ ¸¸µé ¼ö ÀÖ½À´Ï´Ù.

	class Draw2D extends JFrame {
		ExitController exiter = new ExitController(); // À©µµ¿ì Á¾·á ¸Þ½ÃÁö ó¸® °´Ã¼
		DrawCanvas canvas = new DrawCanvas(); // ĵ¹ö½º ÄÄÆ÷³ÍÆ®
	
		// »ý¼ºÀÚ
		Draw2D(String title) {
			super(title);
			// ¸Þ´º¹Ù
			JMenuBar menuBar = new JMenuBar();
			setJMenuBar(menuBar);
	
			JMenu shapeMenu = menuBar.add(new JMenu("Shape"));
			shapeMenu.setMnemonic('S');
			ButtonGroup shapeBG = new ButtonGroup();
	
			... // ¿©±â¿¡ ¸Þ´º¸¦ ¸¸µå´Â ÄÚµåµéÀÌ »ý·«µÇ¾î ÀÖ½À´Ï´Ù.
	
			// ÇÁ·¹ÀÓÀÇ ±âº» ·¹À̾ƿô °ü¸®ÀÚ´Â BorderLayout
			canvas.setBackground(Color.white);
			getContentPane().add(canvas, BorderLayout.CENTER);
	
			// À©µµ¿ì Á¾·á À̺¥Æ® ó¸®
			addWindowListener(exiter);
			setSize(600, 500);
			pack();
			setVisible(true);
		}
	
		// packÀÌ È£ÃâµÉ ¶§ »ç¿ëµÇ´Â Å©±â
		public Dimension getPreferredSize() {
			return new Dimension(500, 400);
		}
	
		// main ¸Þ½îµå
		public static void main(String args[]) {
			new Draw2D("Draw2D Program");
		}
	
		// À©µµ¿ì Á¾·á ¸Þ½ÃÁö¸¦ ó¸®ÇÏ´Â ³»ºÎ Ŭ·¡½º
		class ExitController 	extends WindowAdapter implements ActionListener {
			public void windowClosing(WindowEvent we) {
				Draw2D.this.dispose();
				System.exit(0);
			}
			public void actionPerformed(ActionEvent ae) {
				Draw2D.this.dispose();
				System.exit(0);
			}
		} // Draw2D.ExitController Ŭ·¡½º ³¡
	}
<¿¹Á¦> Draw2D Ŭ·¡½º

½ÇÁ¦ ±×¸²À» ±×¸®´Â ĵ¹ö½º Ŭ·¡½º´Â µµÇü¿¡ °ü·ÃµÈ ÇöÀç Á¤º¸µéÀ» ÀúÀåÇÕ´Ï´Ù.

	class DrawCanvas extends JPanel {
		// µµÇüÀÇ ¸ð¾ç¿¡ °ü·ÃµÈ »ó¼ö
		final static int SHAPE_LINE = 0;
		final static int SHAPE_RECT = 1;
		final static int SHAPE_ROUND_RECT = 2;
		final static int SHAPE_ELLIPSE = 3;
		final static int SHAPE_ARC = 4;
		int shape=SHAPE_LINE; // ±âº» µµÇü ¸ð¾ç
		// ½ºÆ®·ÎÅ©
		final static int STROKE_NORMAL = 0; // ¼± µÎ²² 5
		final static int STROKE_THIN = 1; // ¼± µÎ²² 1
		final static int STROKE_THICK = 2; // ¼± µÎ²² 10
		int stroke = STROKE_NORMAL; // ±âº» ½ºÆ®·ÎÅ©
		boolean dashed = false; // ±âº» °ªÀº ½Ç¼± ½ºÆ®·ÎÅ©
		// ä¿ò ¹æ½Ä
		final static int FILL_SOLID = 0;
		final static int FILL_GRADIENT = 1;
		final static int FILL_PATTERN = 2;
		int fill = FILL_SOLID; // ±âº» ä¿ò ¹æ½Ä
		boolean filled = true; // ±âº» °ªÀ¸·Î ä¿ì±â ¸ðµå
	
		// ¸¶¿ì½º À§Ä¡ À̵¿¿¡ µû¶ó µµÇüÀÇ ½ÃÀÛÁ¡°ú ³¡Á¡À» ÀúÀå
		Point startPoint=new Point(),
			savePoint=new Point(), endPoint=new Point();
		Color fgColor=Color.black; // Àü°æ»ö
		Color bgColor=Color.white; // ¹è°æ»ö
		UIController controller = new UIController();
	
		// ¹öÆÛ¸µÀ» À§ÇØ »ç¿ëÇÏ´Â ¿ÀÇÁ½ºÅ©¸° À̹ÌÁö
		BufferedImage offImage = null;
		Graphics2D offG2 = null; // ¿ÀÇÁ½ºÅ©¸° À̹ÌÁöÀÇ ±×·¡ÇÈ ÄÁÅؽºÆ®
	
		// »ý¼ºÀÚ
		DrawCanvas() {
			// ¸¶¿ì½º À̺¥Æ® 󸮱⠵î·Ï
			MouseController mouseController = new MouseController();
			addMouseMotionListener(mouseController);
			addMouseListener(mouseController);
		}
	
		public void paint(Graphics g) {
			int width = getSize().width;
			int height = getSize().height;
			if (width <=0 || height <= 0)
				return;
			// ¿ÀÇÁ½ºÅ©¸° À̹ÌÁö°¡ ¾øÀ¸¸é »ý¼º
			if (offImage == null || offImage.getWidth() != width
				|| offImage.getHeight() != height)
				createBufferImage(width, height);
			// ¿ÀÇÁ½ºÅ©¸° À̹ÌÁö°¡ Á¸ÀçÇÏ¸é ¿ÀÇÁ½ºÅ©¸° À̹ÌÁö¸¦ ĵ¹ö½º¿¡ µð½ºÇ÷¹ÀÌ
			if (offImage != null)
				((Graphics2D) g).drawImage(offImage, 0, 0, this);
		}
	
		// ¿ÀÇÁ½ºÅ©¸° À̹ÌÁö¿Í ±×·¡ÇÈ ÄÁÅؽºÆ® »ý¼º
		void createBufferImage(int width, int height) {
			offImage = (BufferedImage) createImage(width, height);
			if (offImage != null) {
				offG2 = offImage.createGraphics();
				offG2.setBackground(getBackground());
				offG2.clearRect(0, 0, width, height);
			}
		}
	
		// ½ÇÁ¦ 2D¸¦ »ç¿ëÇÏ¿© ±×¸²À» ±×¸®´Â ·çƾ
		void draw(Graphics2D g, Point startPoint, Point endPoint) {
			// ½ºÆ®·ÎÅ© ÁöÁ¤
			BasicStroke newStroke = null;
			float dash[]={10.0f};
			switch (stroke) {
			case STROKE_THIN :
				if (dashed)
					newStroke = new BasicStroke(1.0f, BasicStroke.CAP_BUTT,
						BasicStroke.JOIN_MITER, 10.0f, dash, 0.0f);
				else
					newStroke = new BasicStroke(1.0f);
				break;
			case STROKE_THICK :
				if (dashed)
					newStroke = new BasicStroke(5.0f, BasicStroke.CAP_BUTT,
						BasicStroke.JOIN_MITER, 10.0f, dash, 0.0f);
				else
					newStroke = new BasicStroke(5.0f);
				break;
			case STROKE_NORMAL :
			default :
				if (dashed)
					newStroke = new BasicStroke(3.0f, BasicStroke.CAP_BUTT,
						BasicStroke.JOIN_MITER, 10.0f, dash, 0.0f);
				else
					newStroke = new BasicStroke(3.0f);
				break;
			}
			g.setStroke(newStroke);
	
			// Àü°æ»ö ÁöÁ¤
			g.setColor(fgColor);
	
			// ä¿ì±â¸¦ »ç¿ëÇÒ °æ¿ì ä¿ò ¹æ½Ä ÁöÁ¤
			if (filled) {
				switch (fill) {
				case FILL_GRADIENT : // ±×¶óµð¾ðÆ® ä¿ì±â
					GradientPaint gp = new GradientPaint(startPoint, fgColor,
						endPoint, bgColor);
					g.setPaint(gp);
					break;
				case FILL_PATTERN : // ÆÐÅÏ Ã¤¿ì±â
					// ÀÛÀº ¿ÀÇÁ½ºÅ©¸° À̹ÌÁö¿¡ ÆÐÅÏÀ¸·Î »ç¿ëÇÒ À̹ÌÁö¸¦ ±×¸³´Ï´Ù.
					BufferedImage bi = new BufferedImage(5, 5, 
						BufferedImage.TYPE_INT_RGB);
					Graphics2D big = bi.createGraphics();
					try {
						big.setColor(fgColor);
						big.fillRect(0, 0, 5, 5);
						big.setColor(bgColor);
						big.fillOval(0, 0, 5, 5);
					} finally {
						big.dispose();
					}
					Rectangle r = new Rectangle(0,0,5,5);
					TexturePaint texture = new
						TexturePaint(bi, r);
					g.setPaint(texture);
					break;
				case FILL_SOLID : 
				// ¾Õ¿¡¼­ setColor() ¸Þ¼Òµå¸¦ È£ÃâÇßÀ¸¹Ç·Î ó¸®ÇÒ ÇÊ¿ä°¡ ¾ø½À´Ï´Ù.
				default :
					break;
				}
			}
	
			Shape newShape = null;
			// ±×¸± µµÇüÀÇ ¸ð¾ç ÁöÁ¤
			switch (shape) {
			case SHAPE_RECT :
				newShape = new Rectangle2D.Float(
						(float) startPoint.x, (float) startPoint.y,
						(float) endPoint.x-(float) startPoint.x,
						(float) endPoint.y-(float) startPoint.y);
				break;
			case SHAPE_ROUND_RECT :
				newShape = new RoundRectangle2D.Float(
						(float) startPoint.x, (float) startPoint.y,
						(float) endPoint.x-(float) startPoint.x,
						(float) endPoint.y-(float) startPoint.y,
						(endPoint.x-startPoint.x)/10.0f,
						(endPoint.y-startPoint.y)/10.0f );
				break;
			case SHAPE_ELLIPSE :
				newShape = new Ellipse2D.Float(
						(float) startPoint.x, (float) startPoint.y,
						(float) endPoint.x-(float) startPoint.x,
						(float) endPoint.y-(float) startPoint.y);
				break;
			case SHAPE_ARC :
				newShape = new Arc2D.Float(
						(float) startPoint.x, (float) startPoint.y,
						(float) endPoint.x-(float) startPoint.x,
						(float) endPoint.y-(float) startPoint.y,
						0.0f, 90.0f, Arc2D.PIE);
				break;
			case SHAPE_LINE :
			default :
				newShape = new Line2D.Float(
					(float) startPoint.x, (float) startPoint.y,
					(float) endPoint.x, (float) endPoint.y);
				break;
			}
			// ä¿ì±â ¸ðµåÀ̸é fill() ¸Þ½îµå È£Ãâ
			if (filled) 
				g.fill(newShape);
			// ¿Ü°û¼±Àº Ç×»ó ±×¸³´Ï´Ù.
			g.draw(newShape);
		}
		... // ´Ù¸¥ ³»ºÎ Ŭ·¡½º ¼±¾ðÀÌ ¿©±â¿¡ µé¾î°©´Ï´Ù.
	}
<¿¹Á¦> DrawCanvas Ŭ·¡½º

´ÙÀ½Àº ¸¶¿ì½º À̺¥Æ®¸¦ ó¸®ÇÏ¿© ±×¸²À» ±×¸®´Â DrawCanvas.MouseController Ŭ·¡½ºÀÔ´Ï´Ù.

	class MouseController extends MouseInputAdapter {
		// µå·¡±ëÇÒ ¶§ ¿òÁ÷ÀÌ´Â ÀÜ»óÀ» º¸¿©ÁÝ´Ï´Ù.
		public void mouseDragged(MouseEvent me) { 
			Graphics2D g=(Graphics2D) getGraphics();
			try {
				g.setXORMode(
					new Color(255-fgColor.getRed(),
						255-fgColor.getGreen(),
						255-fgColor.getBlue()));
				
				draw(g, startPoint, savePoint);
				endPoint = me.getPoint();
				draw(g, startPoint, endPoint);
				savePoint=endPoint;
			}
			finally {
				g.dispose();
			}
		}
		// ¸¶¿ì½º°¡ ´­·ÁÁö¸é ½ÃÀÛÁ¡À» ÀúÀåÇÕ´Ï´Ù.
		public void mousePressed(MouseEvent me) {
			startPoint = me.getPoint();
			savePoint = startPoint;
		}
		// ¸¶¿ì½º°¡ ³õ¿©Áö¸é ³¡Á¡À» ÀúÀåÇÏ°í 
		// ÇöÀç ĵ¹ö½º¿Í ¿ÀÇÁ½ºÅ©¸° ¸ðµÎ¿¡ µµÇüÀ» ±×¸³´Ï´Ù.
		public void mouseReleased(MouseEvent me) {
			endPoint = me.getPoint();
			Graphics2D g=(Graphics2D) getGraphics();
			try {
				draw(g, startPoint, endPoint);
				if (offG2 != null)
					draw(offG2, startPoint, endPoint);
			}
			finally {
				g.dispose();
			}
		}
	}
<¿¹Á¦> DrawCanvas.MouseController Ŭ·¡½º

¸Þ´º À̺¥Æ®¸¦ ó¸®ÇÏ´Â DrawCanvas.UIController Ŭ·¡½º´Â »ý·«ÇÕ´Ï´Ù. Draw2D.javaÀÇ ¼Ò½º Äڵ带 ÂüÁ¶Çϱ⠹ٶø´Ï´Ù.

<±×¸²> Draw2D ÇÁ·Î±×·¥ ½ÇÇà ¸ð½À

ÀÚ¹Ù 2D´Â ´Ü¼øÇÑ µå·ÎÀ× ±â´É »Ó¸¸ ¾Æ´Ï¶ó ±Û²Ã ó¸®, À̹ÌÁö ó¸® ±â´É, Àμâ ó¸® ±â´É µî ´Ù¾çÇÑ ºÎºÐ¿¡ °ÉÃÄ ÀÖÁö¸¸ ¿©±â¿¡¼­´Â µå·ÎÀ× ±â´É¿¡¸¸ ±¹ÇÑÇÏ¿´½À´Ï´Ù. °ü½ÉÀÖ´Â µ¶ÀÚµéÀº JFC ȨÆäÀÌÁö(http://java.sun.com/products/jfc)¿¡¼­ ¸¹Àº Á¤º¸¸¦ ¸¸³¯ ¼ö ÀÖ½À´Ï´Ù.

ÇÙ½É Ã¼Å©

¢Â ½ºÀ® ÄÄÆ÷³ÍÆ®´Â ¼ø¼öÇÑ ÀÚ¹Ù ÄÚµå·Î ÀÛ¼ºµÈ °æ·® ÄÄÆ÷³ÍÆ®µéÀÔ´Ï´Ù.

¢Â ½ºÀ® ÄÄÆ÷³ÍÆ®´Â AWT ÄÄÆ÷³ÍÆ®¿¡¼­ ã¾Æº¼ ¼ö ¾ø´Â ´Ù¾çÇÏ°í Æí¸®ÇÑ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÕ´Ï´Ù.

¢Â À̺¥Æ® ó¸® ¾²·¹µå°¡ ¾Æ´Ñ ¾²·¹µå¿¡¼­ ÄÄÆ÷³ÍÆ®ÀÇ »óŸ¦ º¯È­½ÃÅ°°íÀÚ ÇÒ ¶§¿¡´Â SwingUtilities.invokeLater() µîÀÇ ¸Þ½îµå¸¦ »ç¿ëÇØ¾ß ÇÕ´Ï´Ù.

¢Â 2D ±×·¡ÇÈÀº ÀÚ¹Ù ±×·¡ÇÈÀÇ ±â´ÉÀ» Å©°Ô È®Àå½ÃÄÑ º¸´Ù ÀÚÀ¯·Ó°í ¼¶¼¼ÇÑ ±×·¡ÇÈ Ç¥ÇöÀ» °¡´ÉÇÏ°Ô ÇØÁÝ´Ï´Ù.



¼Ò½º ÄÚµåµéÀº ¿©±â¿¡¼­ ã¾Æº¼ ¼ö ÀÖ½À´Ï´Ù.

ÇÊÀÚ ¿¬¶ôó : yoonforh@yahoo.com


Last modified: Fri Jul 05 13:19:33 +0900 2002