Core Java Technologies Tech Tip¿¡ ¿À½Å ¿©·¯ºÐÀ» ȯ¿µÇÕ´Ï´Ù
Core Java Technologies
TECHNICAL TIPS
2005³â 12¿ù 20ÀÏÀÚ
  À̹ø È£¿¡¼­´Â,

» ½ºÇ÷¡½Ã ½ºÅ©¸°°ú MUSTANG
» Å×À̺í Á¤·Ä ¹× ÇÊÅ͸µ

À» ´Ù·ì´Ï´Ù.



½ºÇ÷¡½Ã ½ºÅ©¸°°ú MUSTANG
 

Wikipedia¿¡ µû¸£¸é ½ºÇ÷¡½Ã ½ºÅ©¸°Àº ÇÁ·Î±×·¥À̳ª ¿î¿µÃ¼Á¦°¡ ·ÎµùµÇ´Â µ¿¾È Ç¥½ÃµÇ´Â À̹ÌÁö¸¦ °¡¸®Å°´Â ÄÄÇ»ÅÍ ¿ë¾î·Î¼­, »ç¿ëÀÚ¿¡°Ô ÇÁ·Î±×·¥ÀÌ ÃʱâÈ­µÇ°í ÀÖ´Ù´Â °ÍÀ» ½Ã°¢ÀûÀ¸·Î º¸¿©ÁÖ´Â ¿ªÇÒÀ» ÇÑ´Ù. Java SE 6(ÄÚµå¸í Mustang)°¡ Ãâ½ÃµÇ±â Àü¿¡´Â ¸ÞÀÎ ¸Þ¼Òµå¸¦ ½ÃÀÛÇÒ ¶§ âÀ» ¸¸µé°í ±× ¼Ó¿¡ À̹ÌÁö¸¦ ¹èÄ¡ÇÏ¿© ½ºÇ÷¡½Ã ½ºÅ©¸°ÀÇ µ¿ÀÛÀ» º¸¿©ÁÖ´Â °ÍÀÌ °íÀÛÀ̾ú´Ù. À̰͵µ ³ª¸§´ë·Î À¯¿ëÇßÁö¸¸, âÀÌ Ç¥½ÃµÇ±â Àü¿¡ Java ·±Å¸ÀÓÀÌ ¿ÏÀüÈ÷ ÃʱâÈ­µÉ Çʿ䰡 ÀÖ¾ú´Ù. ÇÑÆí, ÀÌ ÃʱâÈ­ °úÁ¤¿¡´Â AWT¿Í º¸Åë SwingÀÌ Æ÷ÇԵǾî Ãʱ⠱׷¡ÇÈ µð½ºÇ÷¹À̸¦ Áö¿¬½ÃŰ´Â ¿øÀÎÀÌ µÇ¾ú´Ù. MustangÀÇ °æ¿ì¿¡´Â, »õ·Î¿î ¸í·É¾î ¶óÀÎ ¿É¼ÇÀ¸·Î ÀÌ ±â´ÉÀ» ÈξÀ ½±°Ô ¸¸µé¾îÁÙ »Ó ¾Æ´Ï¶ó »ç¿ëÀÚ¿¡°Ô À̹ÌÁö¸¦ ´õ ºü¸£°Ô, Áï Java ·±Å¸ÀÓÀÌ ½ÃÀ۵DZ⵵ Àü¿¡ µð½ºÇ÷¹À̸¦ °¡´ÉÇÏ°Ô ÇØÁØ´Ù. ÀÌ ±â´ÉÀÌ ÃÖÁ¾ÀûÀ¸·Î Æ÷ÇԵǷÁ¸é JCPÀÇ ½ÂÀÎÀ» ¹Þ¾Æ¾ß ÇÑ´Ù.

¸í·É¾î ¶óÀÎ ¿É¼Ç

¸í·É¾î ¶óÀÎÀ¸·Î ÇÁ·Î±×·¥À» ½ÇÇàÇϸé -splash ¸í·É¾î ¶óÀÎ ½ºÀ§Ä¡¸¦ ÅëÇØ ½ºÇ÷¡½Ã ½ºÅ©¸°À» »ý¼ºÇÒ ¼ö ÀÖ´Ù. ÀÌ ±â´ÉÀº ½ºÅ©¸³Æ®, ¹èÄ¡ ÆÄÀÏ, ¹ÙÅÁÈ­¸é ¹Ù·Î°¡±â µîÀ» ÀÌ¿ëÇØ¼­ ÇÁ·Î±×·¥À» ½ÇÇàÇÒ ¶§ ƯÈ÷ À¯¿ëÇϸç, ¸í·É¾î ¶óÀÎ ½ºÀ§Ä¡ µÚ¿¡´Â ´ÙÀ½°ú °°Àº À̹ÌÁö À̸§ÀÌ ¿Â´Ù.
   java -splash:Hello.png HelloWorld
-splash¿Í À̹ÌÁö À̸§ »çÀÌ¿¡´Â ÄÝ·ÐÀÌ µé¾î°£´Ù. ÀÌ·¸°Ô ÇÏ¸é ·±Å¸ÀÓ È¯°æÀÌ ¿ÏÀüÈ÷ ÃʱâÈ­µÇ±â Àü¿¡ À̹ÌÁö°¡ Áï½Ã µð½ºÇ÷¹À̵ȴÙ(È­¸éÀÇ Áß¾Ó¿¡ µð½ºÇ÷¹À̵Ê). ½ºÇ÷¡½Ã ½ºÅ©¸° À̹ÌÁö¿¡´Â GIF, PNG, JPEG µîÀÇ Æ÷¸ËÀÌ »ç¿ëµÉ ¼ö ÀÖÀ¸¸ç, Åë»óÀûÀÎ Image Ŭ·¡½º¿Í ¸¶Âù°¡Áö·Î ½ºÇ÷¡½Ã ½ºÅ©¸° À̹ÌÁö´Â ¾Ö´Ï¸ÞÀ̼Ç, Åõ¸í(transparency), ¹ÝÅõ¸í(translucency. Microsoft Windows 2000 ¶Ç´Â XP¿¡¼­¸¸ Áö¿ø) µîÀÇ È¿°ú¸¦ Áö¿øÇÑ´Ù. ¾ÖÇø®ÄÉÀ̼ÇÀÌ Ã¹ ¹øÂ° âÀ» »ý¼ºÇÏ¸é ½ºÇ÷¡½Ã ½ºÅ©¸°Àº »ç¶óÁø´Ù.

JAR ÆÄÀÏ Manifest

ÀϹÝÀûÀ¸·Î ´ëºÎºÐÀÇ »ç¿ëÀÚ´Â ¸í·É¾î ¶óÀÎ ¿£Æ®¸®¿¡ -splash¸¦ »ðÀÔÇϱ⸦ ¿øÄ¡ ¾Ê´Â´Ù. µû¶ó¼­, º¸´Ù È¿°úÀûÀ¸·Î ½ºÇ÷¡½Ã ½ºÅ©¸°À» µð½ºÇ÷¹ÀÌÇÏ´Â ¹æ¹ýÀº ¾ÖÇø®ÄÉÀ̼ÇÀ» À§ÇÑ manifest ÆÄÀÏÀ» »ý¼ºÇÑ ´ÙÀ½ ¾ÖÇø®ÄÉÀ̼ǿ¡ JAR ÆÄÀÏ ³»ÀÇ manifest¿Í À̹ÌÁö¸¦ °áÇÕÇÏ´Â °ÍÀÌ´Ù. »ç¿ëÀÚ°¡ JAR ÆÄÀϷκÎÅÍ ¾ÖÇø®ÄÉÀ̼ÇÀ» ·ÐÄ¡ÇÒ ¶§ ½ºÇ÷¡½Ã ½ºÅ©¸°ÀÌ Ç¥½ÃµÇ´Âµ¥, ÀÌ °æ¿ì¿¡´Â »ç¿ëÀÚ°¡ ¸í·É¾î ¶óÀÎ ¿É¼ÇÀ» ÁöÁ¤ÇÏÁö ¾Ê¾Æµµ µÈ´Ù.

manifest ÆÄÀÏ ¿É¼ÇÀº SplashScreen-Image·Î ¸í¸íµÇ°í, ¿É¼Ç µÚ¿¡´Â À̹ÌÁö ÆÄÀϸíÀÌ ¿Â´Ù. ÆÄÀÏÀÌ JAR ÆÄÀÏÀÇ Åé ·¹º§¿¡ ÀÖÁö ¾ÊÀ» °æ¿ì¿¡´Â ÆÄÀϸíÀÇ Àüü °æ·Î¸¦ ÁöÁ¤ÇÒ Çʿ䰡 ÀÖ´Ù.

´ÙÀ½Àº ÀÌ »õ·Î¿î ½ºÇ÷¡½Ã ½ºÅ©¸° ±â´ÉµéÀ» º¸¿©ÁÖ´Â °£´ÜÇÑ ¿¹Á¦ÀÌ´Ù . ¸ÕÀú, ´ÙÀ½ ÇÁ·Î±×·¥À» ÀÛ¼ºÇϵµ·Ï ÇÑ´Ù.
   import javax.swing.*;
   import java.awt.*;
   
   public class HelloSplash {
     public static void main(String args[]) {
       Runnable runner = new Runnable() {
         public void run() {
           try {
               Thread.sleep(1500);
           } catch (InterruptedException e) {
           }
           JFrame frame = new JFrame("Splash Me");
           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           JLabel label = new JLabel(
                "Hello, Splash", JLabel.CENTER);
           frame.add(label, BorderLayout.CENTER);
           frame.setSize(300, 95);
           frame.setVisible(true);
        }
       };
       EventQueue.invokeLater(runner);
     }
    } 
À̾ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇÑ´Ù.
    javac HelloSplash.java
±×·± ´ÙÀ½ ¸í·É¾î ¶óÀÎ -splash¸¦ ½ÃÇèÇØº»´Ù. ÀÛ¾÷À» ´Ü¼øÈ­½Ã۱â À§ÇØ, ÇÁ·Î±×·¥°ú µ¿ÀÏÇÑ µð·ºÅ͸®¿¡ ÀÖ´Â ½ºÇ÷¡½Ã ½ºÅ©¸° À̹ÌÁö¸¦ »ç¿ëÇÑ´Ù.
   java -splash:MyImage.png HelloSplash
MyImage°¡ Áï½Ã È­¸é Áß¾Ó¿¡ ¹èÄ¡µÇ°í, À̾ Java ·±Å¸ÀÓ È¯°æÀÌ ÃʱâÈ­µÇ°í ³ª¸é ¾ÖÇø®ÄÉÀÌ¼Ç È­¸éÀÌ Ç¥½ÃµÇ´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.

My Image

Hello Splash

ÀÌÁ¦ JAR ÆÄÀÏ ¹æ½ÄÀ» ½ÃÇèÇØ º¸±â·Î ÇÏÀÚ. ¸ÕÀú manifest¸¦ À§ÇÑ manifest.mf ÆÄÀÏÀ» »ý¼ºÇÑ´Ù. ÆÄÀÏÀÇ ³»¿ëÀº ´ÙÀ½°ú °°Àº ÇüÅÂÀ̾î¾ß ÇÑ´Ù.
   Manifest-Version: 1.0
   Main-Class: HelloSplash
   SplashScreen-Image: MyImage.png
À̾ JAR ÆÄÀÏÀ» ÆÐŰÁöÇÑ´Ù.
   jar -mcvf manifest.mf Splash.jar HelloSplash*.class MyImage.png
±×·± ´ÙÀ½ -splash ¸í·É¾î ¶óÀÎ ¿É¼ÇÀ» ÁöÁ¤ÇÏÁö ¾Ê°í JAR¸¦ ½ÇÇàÇÑ´Ù.
   java -jar Splash.jar
ÀÌÀü°ú ¸¶Âù°¡Áö·Î ½ºÇ÷¡½Ã ½ºÅ©¸°¿¡ À̾ ¾ÖÇø®ÄÉÀÌ¼Ç È­¸éÀÌ Ç¥½ÃµÇ¾î¾ß ÇÑ´Ù.

¿©·¯ºÐÀÇ JAR ÆÄÀÏÀÌ manifest¿¡ ÁöÁ¤µÈ ½ºÇ÷¡½Ã ½ºÅ©¸° À̹ÌÁö¸¦ °¡Áö°í ÀÖ°í, »ç¿ëÀÚ°¡ ¸í·É¾î ¶óÀο¡¼­ ½ºÇ÷¡½Ã À̹ÌÁö¸¦ ÁöÁ¤ÇÏ´Â °æ¿ì¿¡´Â ¸í·É¾î ¶óÀÎ À̹ÌÁö¿¡ ¿ì¼±±ÇÀÌ ÁÖ¾îÁö°í ´ë½Å Ç¥½ÃµÈ´Ù.

°í±Þ ±â´É

´ë°³ÀÇ °æ¿ì¿¡´Â ¸í·É¾î ¶óÀÎ -splash ¹× manifest SplashScreen-Image ¿É¼ÇÀ¸·Î ÃæºÐÇÏÁö¸¸, Mustang¿¡´Â ´õ ¸¹Àº ½ºÇ÷¡½Ã ½ºÅ©¸° ±â´ÉÀÌ µé¾î ÀÖ´Ù. java.awt ÆÐŰÁö´Â ´Ü¼øÈ÷ ½ºÇ÷¡½Ã ½ºÅ©¸° À̹ÌÁö¸¦ º¸¿©ÁÖ´Â °Í ÀÌ»óÀÇ Áøº¸µÈ ±â´ÉÀ» À§ÇÑ SplashScreen Ŭ·¡½º¸¦ Á¦°øÇÑ´Ù.

-splash ¸í·É¾î ¶óÀÎ ¿É¼ÇÀ̳ª manifestÀÇ SplashScreen-Image ¿É¼ÇÀ¸·Î À̹ÌÁö°¡ »ý¼ºµÈ °æ¿ì¿¡´Â SplashScreen Ŭ·¡½ºÀÇ getSplashScreen() ¸Þ¼Òµå°¡ »ý¼ºµÈ È­¸éÀ» ¹ÝȯÇÑ´Ù. À̹ÌÁö°¡ »ý¼ºµÇÁö ¾Ê¾Ò´Ù¸é getSplashScreen()ÀÌ nullÀ» ¹ÝȯÇÑ´Ù.

´Ù¸¥ SplashScreen ¸Þ¼Òµå¸¦ ÀÌ¿ëÇØ¼­ ½ºÇ÷¡½Ã ½ºÅ©¸°°ú °ü·ÃµÈ ´Ù¾çÇÑ »ç½ÇÀ» ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù.
  • getBounds()´Â ½ºÇ÷¡½Ã ½ºÅ©¸° Á÷»ç°¢ÇüÀÇ ¹Ù¿îµå¸¦ ¹ÝȯÇÑ´Ù.
  • getImageURL()Àº ½ºÇ÷¡½Ã ½ºÅ©¸° À̹ÌÁöÀÇ URLÀ» ¹ÝȯÇÑ´Ù.
  • getSize()´Â ½ºÇ÷¡½Ã ½ºÅ©¸° âÀÇ Å©±â¸¦ ¹ÝȯÇÑ´Ù.
  • isVisible()Àº ½ºÇ÷¡½Ã ½ºÅ©¸°ÀÌ °¡½ÃÀûÀÎÁö ¿©ºÎ¸¦ ¾Ë·ÁÁØ´Ù.
½ºÇ÷¡½Ã ½ºÅ©¸°ÀÌ ·ÎµåµÈ ÈÄ¿¡ À̹ÌÁö¸¦ º¯°æÇÒ ¼ö ÀÖÁö¸¸, ÀÌ´Â ¾ÖÇø®ÄÉÀ̼ÇÀÌ ½ÃÀ۵DZâ Àü±îÁö¸¸ °¡´ÉÇÏ´Ù. ¿©±â¿¡´Â µÎ °¡Áö ¹æ¹ýÀÌ »ç¿ëµÈ´Ù. setImageURL() ¸Þ¼Òµå´Â µð½ºÇ÷¹ÀÌÇÒ »õ À̹ÌÁö¿¡ ´ëÇÑ URLÀ» Á¦°øÇÒ ¼ö ÀÖ°Ô ÇØÁÖ°í, ´õ ÀϹÝÀûÀÎ µÎ ¹øÂ° ¹æ¹ýÀº getGraphics() ¸Þ¼Òµå¸¦ È£ÃâÇÏ¿© âÀÇ ±×·¡ÇÈ ÄÁÅØ½ºÆ®(java.awt.Graphics)¸¦ ¾ò´Â °ÍÀÌ´Ù. ±×·± ´ÙÀ½ Åë»óÀûÀÎ ±×·¡ÇȰú Java 2D API¸¦ ÅëÇØ À̹ÌÁö¸¦ ¾÷µ¥ÀÌÆ®Çϴµ¥, ±× ÀÌÀ¯´Â À̰ÍÀÌ ´Ü¼øÇÑ java.awt.Graphics°¡ ¾Æ´Ï¶ó Graphics2DÀÇ ÀνºÅϽºÀ̱⠶§¹®ÀÌ´Ù. ±×·¡ÇÈ ÄÁÅØ½ºÆ®¿¡ µå·Î¿ì(draw)ÇÑ ÈÄ SplashScreenÀÇ update() ¸Þ¼Òµå¸¦ È£ÃâÇÏ¿© ¾÷µ¥ÀÌÆ®µÈ À̹ÌÁö¸¦ µå·Î¿ìÇÑ´Ù.

´ÙÀ½Àº ½ºÇ÷¡½Ã ½ºÅ©¸°¿¡ Ç¥½ÃµÇ´Â ÀÏ·ÃÀÇ »ö»óÀ» ¼øÈ¯ÇÏ´Â ÈĹÝÀÇ µ¿ÀÛÀ» º¸¿©ÁÖ´Â ¿¹Á¦ÀÌ´Ù. À̰ÍÀÌ ÇÁ·Î±×·¹½º ¹Ù, ¶Ç´Â ¾ÖÇø®ÄÉÀÌ¼Ç ÃʱâÈ­ÀÇ ÁøÇà »óŸ¦ ³ªÅ¸³»´Â ´Ù¸¥ »óÅ µ¥ÀÌÅ͸¦ µð½ºÇ÷¹ÀÌÇÏ´Â °ÍÀ» »ó»óÇØº¸¶ó.
   import javax.swing.*;
   import java.awt.*;
   import java.awt.geom.*;
   import java.util.*;

   public class ExtendedSplash {
     public static void main(String args[]) {
       Runnable runner = new Runnable() {
         public void run() {
           Random random = new Random();
           SplashScreen splash = SplashScreen.getSplashScreen();
           Graphics2D g = (Graphics2D)splash.getGraphics();
           Dimension dim = splash.getSize();
           Color colors[] = {Color.RED, Color.ORANGE, 
             Color.YELLOW, Color.GREEN, Color.BLUE, 
             Color.MAGENTA};
           for (int i=0; i<100; i++) {
             g.setColor(colors[i % colors.length]);
             g.fillRect(50, 50, dim.width-100, dim.height-100);
             splash.update();
             try {
               Thread.sleep(250);
             } catch (InterruptedException ignored) {
             }
           }
           JFrame frame = new JFrame("Splash Me2");
           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           JLabel label = 
             new JLabel("Hello, Splash", JLabel.CENTER);
           frame.add(label, BorderLayout.CENTER);
           frame.setSize(300, 95);
           frame.setVisible(true);
         }
       };
       EventQueue.invokeLater(runner);
     }
   }
color Splash

½ºÇ÷¡½Ã ½ºÅ©¸° À̹ÌÁö À§¿¡¼­ ¾î¶»°Ô µå·ÎÀ×ÀÌ ÀÌ·ç¾îÁö´ÂÁö ÁÖ¸ñÇÒ °Í.

¿¹Á¦´Â »ö»ó ¼øÈ¯ÀÌ ¿Ï·áµÈ ÈÄÀÇ ÇÁ·¹ÀÓÀ» º¸¿©Áִµ¥, ÀÌ´Â ½Ãµ¿ °úÁ¤ÀÇ ÀüÇüÀûÀÎ ¾ç»óÀ¸·Î, ÃʱâÈ­°¡ ¿Ï·áµÈ ÈÄ ÇÁ·¹ÀÓÀÌ Ç¥½ÃµÇ¸é¼­ ½ºÇ÷¡½Ã ½ºÅ©¸°À» °¡¸®°Ô µÈ´Ù.

¸¶Áö¸·À¸·Î ¾ð±ÞÇÒ SplashScreen ¿É¼ÇÀÇ °æ¿ì close() ¸Þ¼Òµå°¡ »ç¿ëµÇ´Âµ¥, âÀ» ´Ý°í °ü·ÃµÈ ¸®¼Ò½º¸¦ ÇØÁ¦ÇϰíÀÚ ÇÒ °æ¿ì¿¡ ÀÌ ¸Þ¼Òµå¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù. ù ¹øÂ° âÀÌ °¡½ÃÀûÀ¸·Î µÇ¸é ÀÌ ¸Þ¼Òµå°¡ ÀÚµ¿À¸·Î È£ÃâµÇ±â ¶§¹®¿¡ ±»ÀÌ È£ÃâÇÒ ÇÊ¿ä´Â ¾ø´Ù.

½ºÇ÷¡½Ã ½ºÅ©¸°À» ÀÌ¿ëÇÏ´Â ¹æ¹ý¿¡ °üÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº Å×Å©´ÏÄà ¾ÆÆ¼Å¬ ¡°MustangÀÇ »õ·Î¿î ½ºÇ÷¡½Ã ½ºÅ©¸° ±â´É(New Splash-Screen Functionality in Mustang)¡±À» ÂüÁ¶Çϱ⠹ٶõ´Ù. ¾Æ¿ï·¯, SplashScreen Ŭ·¡½º¸¦ À§ÇÑ javadocÀ» ÇÔ²² ÂüÁ¶ÇÒ °Í.

À§·Î °¡±â

Å×À̺í Á¤·Ä ¹× ÇÊÅ͸µ
 

Java SE 6.0(ÄÚµå¸í Mustang)¿¡´Â Swing JTableÀÇ ³»¿ëÀ» ÈξÀ ½±°Ô Á¤·ÄÇϰí ÇÊÅ͸µÇÒ ¼ö ÀÖ°Ô ÇØÁÖ´Â ¸î °¡Áö ±â´ÉÀÌ Ãß°¡µÈ´Ù. (ÀÌ ±â´ÉµéÀÌ ÃÖÁ¾ÀûÀ¸·Î Æ÷ÇԵǷÁ¸é JCPÀÇ ½ÂÀÎÀ» °ÅÃÄ¾ß ÇÑ´Ù.) ÃÖ±ÙÀÇ Å×À̺í Á᫐ »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º´Â ´ëºÎºÐ »ç¿ëÀÚ°¡ Å×À̺í Çì´õ¸¦ Ŭ¸¯ÇÏ¿© Ä®·³À» Á¤·ÄÇÒ ¼ö ÀÖµµ·Ï µÇ¾î Àִµ¥, ÀÌ´Â Mustang ÀÌÀü¿¡ Swing JTable Áö¿øÀ» ÅëÇØ °¡´ÉÇÏ°Ô µÇ¾ú´Ù. ÀÌ ±â´ÉÀ» ÇÊ¿ä·Î ÇÏ´Â °¢ Å×ÀÌºí¿¡ ÀÏÀÏÀÌ ¼öµ¿À¸·Î ±â´ÉÀ» Ãß°¡ÇØ ÁÖ¾î¾ß¸¸ ÇÏ´Â ºÒÆíÀÌ µû¶úÁö¸¸ MustangÀº ÃÖ¼ÒÇÑÀÇ ³ë·ÂÀ¸·Î ÀÌ ±â´ÉÀ» »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. ÇÊÅ͸µÀº »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º¿¡¼­ ÀϹÝÀûÀ¸·Î ÀÌ¿ëÇÒ ¼ö ÀÖ´Â ¶Ç ´Ù¸¥ ¿É¼ÇÀ¸·Î¼­, Å×ÀÌºí ³»¿¡¼­ »ç¿ëÀÚ°¡ Á¦°øÇÏ´Â ±âÁØ¿¡ ºÎÇÕÇÏ´Â ÇุÀ» µð½ºÇ÷¹ÀÌÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù. MustangÀ» ÀÌ¿ëÇϸé JTable ÄÁÅÙÃ÷ ÇÊÅ͸µÀÌ ÈξÀ ¿ëÀÌÇØÁø´Ù.

Çà Á¤·ÄÇϱâ

Mustang¿¡¼­ ÇàÀ» Á¤·ÄÇϰí ÇÊÅ͸µÇÏ´Â ±âÁØÀÌ µÇ´Â °ÍÀÌ ¹Ù·Î Ãß»ó RowSorter Ŭ·¡½º·Î¼­, ÀÌ RowSorter´Â µÎ °¡Áö ¸ÅÇÎ-JTable ³»ÀÇ ÇÑ ÇàÀ» ±âº» ¸ðµ¨ÀÇ ¿¤¸®¸ÕÆ®·Î, ±×¸®°í ´Ù½Ã ¹Ý´ë·Î-À» À¯ÁöÇÑ´Ù. ÀÌ´Â ÇϳªÀÇ ÇàÀÌ Á¤·Ä°ú ÇÊÅ͸µÀ» ¼öÇàÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù. ÀÌ Å¬·¡½º´Â TableModel °ú ListModel ¸ðµÎ¿¡ Àû¿ëµÉ ¸¸Å­ Æ÷°ýÀûÀ̱ä ÇÏÁö¸¸ TableRowSorter¿¡¸¸ JTable¿¡ Àû¿ëµÇ´Â Mustang ¶óÀ̺귯¸®°¡ Á¦°øµÈ´Ù.

°¡Àå °£´ÜÇÑ °æ¿ì¸¦ ¿¹·Î µé¸é, TableModelÀ» TableRowSorter »ý¼ºÀÚ¿¡ ÆÐ½ºÇÑ ´ÙÀ½ »ý¼ºµÈ RowSorter¸¦ JTableÀÇ setRowSorter() ¸Þ¼Òµå·Î ÆÐ½ºÇÑ´Ù. ´ÙÀ½Àº ÀÌ·± ¹æ½ÄÀ» º¸¿©ÁÖ´Â ¿¹Á¦ ÇÁ·Î±×·¥ SortTableÀÌ´Ù.
   import javax.swing.*;
   import javax.swing.table.*;
   import java.awt.*;

   public class SortTable {
     public static void main(String args[]) {
       Runnable runner = new Runnable() {
        public void run() {
           JFrame frame = new JFrame("Sorting JTable");
           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           Object rows[][] = {
               {"AMZN", "Amazon", 41.28},
               {"EBAY", "eBay", 41.57},
               {"GOOG", "Google", 388.33},
               {"MSFT", "Microsoft", 26.56},
               {"NOK", "Nokia Corp", 17.13},
               {"ORCL", "Oracle Corp.", 12.52},
               {"SUNW", "Sun Microsystems", 3.86},
               {"TWX",  "Time Warner", 17.66},
               {"VOD",  "Vodafone Group", 26.02},
               {"YHOO", "Yahoo!", 37.69}
             };
           String columns[] = {"Symbol", "Name", "Price"};
           TableModel model =
               new DefaultTableModel(rows, columns) {
             public Class getColumnClass(int column) {
               Class returnValue;
               if ((column >= 0) && (column < getColumnCount())) {
                 returnValue = getValueAt(0, column).getClass();
               } else {
                 returnValue = Object.class;
               }
               return returnValue;
             }
           };

           JTable table = new JTable(model);
           RowSorter<TableModel> sorter =
             new TableRowSorter<TableModel>(model);
           table.setRowSorter(sorter);
           JScrollPane pane = new JScrollPane(table);
           frame.add(pane, BorderLayout.CENTER);
           frame.setSize(300, 150);
           frame.setVisible(true);
         }
       };
       EventQueue.invokeLater(runner);
     }
   } 
Sort Table 1

µð½ºÇ÷¹ÀÌµÈ Å×À̺íÀÇ Æ¯Á¤ Ä®·³À» Ŭ¸¯Çϰí Ä®·³ÀÇ ³»¿ëÀÌ ÀçÁ¤¸®µÇ´Â °ÍÀ» »ìÆìº»´Ù.

Sort Table 2

Ä¿½ºÅÒ ¼­ºêŬ·¡½º¸¦ »ý¼ºÇÏ´À´Ï Â÷¶ó¸® DefaultTableModelÀ» ÀÌ¿ëÇÏ¸é ¾È µÇ´À³Ä°í Áú¹®À» ´øÁúÁöµµ ¸ð¸¥´Ù. ±× ´ë´äÀº, TableRowSorter°¡ Ä®·³ Á¤·Ä ½Ã Àû¿ëµÇ´Â ÀÏ·ÃÀÇ ±ÔÄ¢À» °¡Áø´Ù´Â °ÍÀÌ´Ù. ±âº»°ªÀ¸·Î, Å×ÀÌºí ³»ÀÇ ¸ðµç Ä®·³Àº Object ŸÀÔÀ¸·Î °£ÁֵȴÙ. µû¶ó¼­, toString()À» È£ÃâÇÔÀ¸·Î½á Á¤·ÄÀÌ ¼öÇàµÇ´Â °ÍÀÌ´Ù. DefaultTableModelÀÇ ±âº»°ª getColumnClass() ºñÇìÀ̺ñ¾î¸¦ ¿À¹ö¶óÀ̵åÇÔÀ¸·Î½á, RowSorter´Â ComparableÀ» ±¸ÇöÇÏ´Â °ÍÀ¸·Î °¡Á¤Çϰí ÇØ´ç Ŭ·¡½ºÀÇ ±ÔÄ¢¿¡ µû¶ó Á¤·ÄÇÑ´Ù. ¶ÇÇÑ, setComparator(int column, Comparator comparator)¸¦ È£ÃâÇÏ¿© ƯÁ¤ Ä®·³À» À§ÇÑ Ä¿½ºÅÒ Comparator¸¦ ¼³Ä¡ÇÒ ¼öµµ ÀÖ´Ù.

´ÙÀ½Àº Á¤·Ä°ú °ü·ÃÀÌ ÀÖ´Â SortTable ÇÁ·Î±×·¥ ³»ÀÇ ¼¼ °¡Áö ÁÖ¿ä ¶óÀÎÀÌ´Ù.
           JTable table = new JTable(model);
           RowSorter<TableModel> sorter =
             new TableRowSorter<TableModel>(model);
           table.setRowSorter(sorter);
ù ¹øÂ° ¶óÀÎÀº ¸ðµ¨À» Å×ÀÌºí¿¡ ¿¬°á½Ã۰í, µÎ ¹øÂ° ¶óÀÎÀº ¸ðµ¨¿¡ ƯÁ¤ RowSorter¸¦ »ý¼ºÇÑ´Ù. ¼¼ ¹øÂ° ¶óÀÎÀº RowSorter¸¦ JTable¿¡ ¿¬°á½ÃŲ´Ù. ÀÌ·Î½á »ç¿ëÀÚ´Â Ä®·³ Çì´õ¸¦ Ŭ¸¯ÇÏ¿© ÇØ´ç Ä®·³À» Á¤·ÄÇÒ ¼ö ÀÖ´Ù. °°Àº Ä®·³À» µÎ ¹ø Ŭ¸¯Çϸé Á¤·Ä ¼ø¼­°¡ ¹Ý´ë·Î µÈ´Ù.

Á¤·Ä ¼ø¼­°¡ ¹Ù²ð ¶§ °¢ÀÚÀÇ ¾×¼ÇÀ» Ãß°¡ÇÏ°í ½ÍÀ¸¸é RowSorter¿¡ RowSorterListener¸¦ ÷ºÎÇÏ¸é µÈ´Ù. ÀÎÅÍÆäÀ̽º´Â ´ÙÀ½°ú °°Àº ÇϳªÀÇ ¸Þ¼Òµå¸¦ °¡Áø´Ù.
   void sorterChanged(RowSorterEvent e)
ÀÌ ¸Þ¼Òµå´Â »óÅ ¹Ù¿¡¼­ ÅØ½ºÆ®¸¦ ¾÷µ¥ÀÌÆ®Çϰųª ¸î °¡Áö Ãß°¡ ŽºÅ©¸¦ ¼öÇàÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù. ÀÌ ¾×¼Ç¿¡ ´ëÇÑ RowSorterEvent´Â RowSorter°¡ ºä ¾ÈÆÆÀÇ ÇàÀ» ÇÊÅ͸µÇÑ °æ¿ì, Á¤·Ä Àü¿¡ ¾ó¸¶³ª ¸¹Àº ÇàÀÌ Á¸ÀçÇß¾ú´ÂÁö ¾Ë¾Æ³¾ ¼ö ÀÖ°Ô ÇØÁØ´Ù.

Å×À̺í Çà ÇÊÅ͸µÇϱâ

RowFilter¸¦ TableRowSorter¿¡ ¿¬°á½ÃÄÑ Å×À̺íÀÇ ³»¿ëÀ» ÇÊÅ͸µÇÏ´Â µ¥ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, RowFilter¸¦ ÀÌ¿ëÇÏ¿© À̸§ÀÌ A ÀÚ·Î ½ÃÀÛÇϰųª ÁÖ°¡°¡ $50¸¦ ³Ñ´Â Çุ Å×ÀÌºí¿¡ µð½ºÇ÷¹À̵ǵµ·Ï ÇÏ´Â °æ¿ì°¡ ±×°ÍÀÌ´Ù. Ãß»ó RowFilter Ŭ·¡½ºÀÇ °æ¿ì ´ÙÀ½°ú °°ÀÌ ÇÊÅ͸µ¿¡ »ç¿ëµÇ´Â ÇϳªÀÇ ¸Þ¼Òµå¸¦ °¡Áø´Ù.
   boolean include(RowFilter.Entry<? extends M,? extends I> entry)
RowSorter¿¡ ¿¬°áµÈ ¸ðµ¨ ³»ÀÇ °¢ ¿£Æ®¸®¿¡ ´ëÇØ, ¸Þ¼Òµå´Â ÁöÁ¤µÈ ¿£Æ®¸®°¡ ¸ðµ¨ÀÇ ÇöÀç ºä¿¡ Ç¥½ÃµÇ¾î¾ß ÇÒÁö ¿©ºÎ¸¦ ¾Ë·ÁÁØ´Ù. ´ë°³ÀÇ °æ¿ì ¿©·¯ºÐÀº °¢ÀÚÀÇ RowFilter ±¸ÇöÀ» »ý¼ºÇÒ ÇÊ¿ä´Â ¾øÀ¸³ª, ´ë½Å RowFilter´Â ÇÊÅÍ »ý¼ºÀ» À§ÇÑ ¿©¼¸ °³ÀÇ Á¤Àû ¸Þ¼Òµå¸¦ Á¦°øÇÑ´Ù.
  • andFilter(Iterable<? extends RowFilter<? super M,? super I>> filters)
  • dateFilter(RowFilter.ComparisonType type, Date date, int... indices)
  • notFilter(RowFilter<M,I> filter)
  • numberFilter(RowFilter.ComparisonType type, Number number, int... indices)
  • orFilter(Iterable<? extends RowFilter<? super M,? super I>> filters)
  • regexFilter(String regex, int... indices)
À妽ºÀÇ ÀÎÀÚ(dateFilter, numberFilter, regexFilter)¸¦ °¡Áö´Â RowFilter ÆÑÅ丮 ¸Þ¼ÒµåÀÇ °æ¿ì¿¡´Â ¸ðµ¨¿¡¼­ ÁöÁ¤µÈ À妽º¿¡ ÀÏÄ¡ÇÏ´Â ÀÏ·ÃÀÇ Ä®·³¸¸À» È®ÀÎÇϰí, ÁöÁ¤µÈ À妽º°¡ ¾øÀ¸¸é ¸ðµç Ä®·³¿¡ ´ëÇØ ÀÏÄ¡ ¿©ºÎ¸¦ È®ÀÎÇÑ´Ù.

dateFilter´Â ³¯Â¥ÀÇ ÀÏÄ¡ ¿©ºÎ¸¦ È®ÀÎÇÒ ¼ö ÀÖ°Ô ÇØÁÖ°í, numberFilter´Â ÀÏÄ¡ÇÏ´Â ¼ö¸¦ È®ÀÎÇÑ´Ù. notFilter´Â ´Ù¸¥ ÇÊÅ͸¦ ¹ÝÀü½ÃŰ´Â µ¥ »ç¿ëµÈ´Ù. Áï, Á¦°ø ÇÊÅÍ¿¡ Æ÷ÇÔµÇÁö ¾Ê´Â ¿£Æ®¸®¸¦ Æ÷ÇÔÇÑ´Ù´Â ¸»Àε¥, ÀÌ ÇÊÅÍ´Â °¡·É 2005³â 12¿ù 25ÀϱîÁö ¿Ï·áµÇÁö ¾ÊÀº ¿£Æ®¸®¸¦ ã´Â´ÙµçÁö ÇÏ´Â ÀÏ¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù. andFilter¿Í orFilter´Â ´Ù¸¥ ÇÊÅ͵éÀ» ³í¸®ÀûÀ¸·Î °áÇÕÇÏ´Â µ¥ »ç¿ëµÇ°í, regexFilter´Â Á¤±Ô Ç¥Çö½ÄÀ» »ç¿ëÇÏ¿© ÇÊÅ͸µÀ» ¼öÇàÇÑ´Ù. ´ÙÀ½Àº regexFilter¸¦ ÀÌ¿ëÇÏ¿© Å×À̺íÀÇ ³»¿ëÀ» ÇÊÅ͸µÇÏ´Â ÇÁ·Î±×·¥ FilterTableÀÌ´Ù.
   import javax.swing.*;
   import javax.swing.table.*;
   import java.awt.*;
   import java.awt.event.*;
   import java.util.regex.*;

   public class FilterTable {
     public static void main(String args[]) {
       Runnable runner = new Runnable() {
         public void run() {
           JFrame frame = new JFrame("Sorting JTable");
           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           Object rows[][] = {
             {"AMZN", "Amazon", 41.28},
             {"EBAY", "eBay", 41.57},
             {"GOOG", "Google", 388.33},
             {"MSFT", "Microsoft", 26.56},
             {"NOK", "Nokia Corp", 17.13},
             {"ORCL", "Oracle Corp.", 12.52},
             {"SUNW", "Sun Microsystems", 3.86},
             {"TWX",  "Time Warner", 17.66},
             {"VOD",  "Vodafone Group", 26.02},
             {"YHOO", "Yahoo!", 37.69}
           };
           Object columns[] = {"Symbol", "Name", "Price"};
           TableModel model =
              new DefaultTableModel(rows, columns) {
             public Class getColumnClass(int column) {
               Class returnValue;
               if ((column >= 0) && (column < getColumnCount())) {
                 returnValue = getValueAt(0, column).getClass();
               } else {
                 returnValue = Object.class;
               }
               return returnValue;
             }
           };
           JTable table = new JTable(model);
           final TableRowSorter<TableModel> sorter =
                   new TableRowSorter<TableModel>(model);
           table.setRowSorter(sorter);
           JScrollPane pane = new JScrollPane(table);
           frame.add(pane, BorderLayout.CENTER);
           JPanel panel = new JPanel(new BorderLayout());
           JLabel label = new JLabel("Filter");
           panel.add(label, BorderLayout.WEST);
           final JTextField filterText =
               new JTextField("SUN");
           panel.add(filterText, BorderLayout.CENTER);
           frame.add(panel, BorderLayout.NORTH);
           JButton button = new JButton("Filter");
           button.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent e) {
               String text = filterText.getText();
               if (text.length() == 0) {
                 sorter.setRowFilter(null);
               } else {
                 try {
                   sorter.setRowFilter(
                       RowFilter.regexFilter(text));
                 } catch (PatternSyntaxException pse) {
                   System.err.println("Bad regex pattern");
                 }
               }
             }
           });
           frame.add(button, BorderLayout.SOUTH);
           frame.setSize(300, 250);
           frame.setVisible(true);
         }
       };
       EventQueue.invokeLater(runner);
     }
   }
µð½ºÇ÷¹ÀÌ´Â ¾îµò°¡¿¡ SUNÀ̶ó´Â ¹®ÀÚ°¡ Æ÷ÇÔµÈ ¸ðµç ¹®ÀÚ¿­¿¡ ´ëÇØ ÇÊÅ͸¦ ¼³Á¤Çϴµ¥, ÀÌ´Â ¹®ÀÚ¿­ "SUN"¡¯¿¡ ÀÇÇØ ¸í½ÃµÈ´Ù. ÀÏÄ¡ ¿©ºÎ¸¦ Á¤È®ÇÏ°Ô °Ë»çÇÏ·Á¸é ¹®ÀÚ¿­ÀÇ ½ÃÀÛ°ú ³¡ °¢°¢¿¡ '^'¿Í '$'ÀÇ ¹®ÀÚ¸¦ ÀÌ¿ëÇÑ´Ù.
Filter Table 1

»ç¿ëÀÚ°¡ ¾Æ·¡ÂÊÀÇ "Filter" ¹öưÀ» ´©¸£¸é ÇÊÅÍ´Â ÀÚüÀûÀ¸·Î Matcher.find()¸¦ »ç¿ëÇÏ¿© Æ÷ÇÔ ¿©ºÎ¸¦ °Ë»çÇÑ´Ù.

Filter Table 2

Å×ÀÌºí¿¡ Ç¥½ÃµÈ ÀÏ·ÃÀÇ ÇàÀ» º¯°æÇÏ·Á¸é ÇÊÅÍ ÅØ½ºÆ®¸¦ º¯°æÇϰí, Å×ÀÌºí ³»ÀÇ ¸ðµç ÇàÀ» º¸°í ½ÍÀ¸¸é ÇÊÅÍ ÅØ½ºÆ®¸¦ »èÁ¦ÇÑ´Ù.

¸¶Áö¸·À¸·Î »©³õÀ» ¼ö ¾ø´Â °ÍÀº, Á¤·ÄÀ̳ª ÇÊÅ͸µ ½Ã ¼±ÅÃÀº ºäÀÇ °üÁ¡¿¡¼­ ÀÌ·ç¾îÁø´Ù´Â Á¡ÀÌ´Ù. µû¶ó¼­, ±âº» ¸ðµ¨¿¡ ¸ÅÇÎÇÒ Çʿ䰡 ÀÖ´Ù¸é convertRowIndexToModel() ¸Þ¼Òµå¸¦ È£ÃâÇØ¾ß ÇÑ´Ù. ¸¶Âù°¡Áö·Î, ¸ðµ¨¿¡¼­ ºä·Î ÀüȯÇÒ °æ¿ì¿¡´Â convertRowIndexToView()¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.

RowSorter, TableRowSorter, RowFilter µî¿¡ °üÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº °¢ Ŭ·¡½º¿¡ °üÇÑ javadocÀ» ÂüÁ¶Çϱ⠹ٶõ´Ù.

RowSorter
TableRowSorter
RowFilter

À§·Î °¡±â

º» ¸ÞÀÏÀº ¼ö½ÅÀ» µ¿ÀÇÇÑ È¸¿ø´Ô¿¡°Ô¸¸ ¹ß¼ÛµË´Ï´Ù.
º» ¸ÞÀÏÀÇ ¼ö½ÅÀ» °ÅºÎÇϰųª ¼ö½ÅÁÖ¼Ò¸¦ º¯°æÇÏ·Á¸é SKDN@Sun.comÀ¸·Î ¹®ÀÇ Áֽñ⠹ٶø´Ï´Ù.

SKDN(Sun Korea Developers Network)¿¡¼­ J2EE/J2SE Å×Å©ÆÁ µî ´Ù¾çÇÑ ¾ÆÆ¼Å¬µéÀ» Âü°íÇϼ¼¿ä.

Copyright 2003-2005 Sun Korea, Ltd. All rights reserved.