¼Ò¼³°°ÀºÀÚ¹Ù3ºÎ  14Àå ±×·¡ÇÈ  14.5 2D Graphics  

 

14.5 2D Graphics

 

 ÀÚ¹Ù 2D Graphics´Â 2D¿¡¼­ ¾Ë ¼ö ÀÖµíÀÌ ÀÚ¹ÙÀÇ GraphicsŬ·¡½ºÀÇ ¸Þ¼­µåµéÀ» ÀÌ¿ëÇØ¼­ ±¸Çö Çß´ø ¿©·¯ °¡Áö µµÇüµéÀ̳ª ¼±, ±×¸®°í ±Û¾¾µé±îÁöµµ 2Â÷¿øÀ¸·Î Ç¥ÇöÇÑ °ÍÀÔ´Ï´Ù. 2Â÷¿øÀ» ±¸Çö Ç߱⠶§¹®¿¡ ±×·ÁÁö´Â °ÍµéÀÌ µ¿ÀûÀ̸ç, ¸Å¿ì È­·ÁÇÕ´Ï´Ù. ÀÌ 2D Graphics¸¦ Áö¿øÇØ Áִ Ŭ·¡½º°¡ Graphics2DŬ·¡½ºÀÔ´Ï´Ù. Ŭ·¡½ºÀÇ ¸â¹ö¸Þ¼­µåµéÀ» Àá±ñ ºÁµµ Graphics¿Í ¸¹ÀÌ ºñ½ÁÇÕ´Ï´Ù. ¿Ö³ÄÇϸé Graphics2DŬ·¡½º´Â Graphics¸¦ »ó¼Ó¹Þ¾Ò±â ¶§¹®ÀÔ´Ï´Ù. ½±°Ô Graphicsº¸´Ù Á» ´õ È­·ÁÇØÁö°í, µ¿ÀûÀ¸·Î º¯Çß´Ù¶ó°í »ý°¢ÇÏ½Ã¸é µÉ °Í °°½À´Ï´Ù.

 Graphics2D¸¦ Á¦´ë·Î ±¸ÇöÇÏ·Á¸é java.awt.geomÆÐŰÁöµî ¿©·¯ ÆÐŰÁö¸¦ import½ÃÄÑ¾ß ÇÕ´Ï´Ù. ÇÏ¿©°£ ¸ÕÀú ¿¹Á¦¸¦ º¸½ÃÁÒ.

 

Graphics2DTest.html (AppletÀ» ·ÎµùÇϱâ À§ÇÑ htmlÆÄÀÏ)

<applet code="Graphics2DTest" width=400 height=300>

</applet>

 

Graphics2DTest.java (2D Graphics¸¦ Å×½ºÆ® Çϱâ À§ÇÑ ¿¹Á¦)

import java.applet.*;

import java.awt.*;

import java.awt.event.*;

import java.awt.font.TextLayout;

import java.awt.font.TextHitInfo;

import java.awt.font.FontRenderContext;

import java.awt.geom.Rectangle2D;

import java.awt.geom.AffineTransform;

import java.awt.image.BufferedImage;

public class Graphics2DTest extends Applet implements Runnable {

    private static String text[] = { "www.jabook.org", "Graphics2D" };

    private static Color colors[] = { Color.cyan, Color.lightGray };

    private static Font smallF = new Font("Georgia", Font.PLAIN, 8);

    private int[] curPos;

    private TextLayout[] layouts;

    private Font[] fonts;

    private long sleepAmount = 900;

    private Thread thread;

    private BufferedImage bimg;

    public void init() {

         final Graphics2DTest g2d = new Graphics2DTest();

         setBackground(Color.white);

       fonts = new Font[2];

       layouts = new TextLayout[fonts.length];

       curPos = new int[fonts.length];

    }

    public void reset(int w, int h) {

        fonts[0] = new Font("Georgia",Font.PLAIN,w/text[0].length()+8);

        fonts[1] = new Font("serif", Font.BOLD,w/text[1].length());

        for (int i = 0; i < layouts.length; i++ ) {

            curPos[i] = 0;

        }

    }

    public void step(int w, int h) {

        for (int i = 0; i < 2; i++) {

            if (layouts[i] == null) {

                continue;

            }

            if (curPos[i]++ == layouts[i].getCharacterCount()) {

                curPos[i] = 0;

            }

        }

    }

    public void drawg2d(int w, int h, Graphics2D g2) {

        FontRenderContext frc = g2.getFontRenderContext();

        for (int i = 0; i < 2; i++) {

            layouts[i]  = new TextLayout(text[i], fonts[i], frc);

            float rx = (float) (w/2-layouts[i].getBounds().getWidth()/2);

            float ry = (float) ((i == 0) ? h/3 : h * 0.75f);

            float rw = (float) (layouts[i].getBounds().getWidth());

            float rh = (float) (layouts[i].getBounds().getHeight());

            Shape hilite = layouts[i].getLogicalHighlightShape(0, curPos[i]);

            AffineTransform at = AffineTransform.getTranslateInstance(rx, ry);

            hilite = at.createTransformedShape(hilite);

            float hy = (float) hilite.getBounds().getY();

            float hh = (float) hilite.getBounds().getHeight();

            g2.setColor(colors[i]);

            g2.fill(hilite);

            Shape[] shapes = layouts[i].getCaretShapes(curPos[i]);

            Shape caret = at.createTransformedShape(shapes[0]);

            g2.setColor(Color.black);

            layouts[i].draw(g2, rx, ry);

            g2.draw(caret);

            g2.draw(new Rectangle2D.Float(rx,hy,rw,hh));

            for (int j = 0; j <= layouts[i].getCharacterCount(); j++) {

                float[] cInfo = layouts[i].getCaretInfo(TextHitInfo.leading(j));

                String str = String.valueOf((int) cInfo[0]);

                TextLayout tl = new TextLayout(str,smallF,frc);

                tl.draw(g2, (float) rx+cInfo[0], hy+hh+tl.getAscent()+1.0f);

            }

        }

    }

    public Graphics2D createGraphics2D(int w, int h) {

        Graphics2D g2 = null;

        if (bimg == null || bimg.getWidth() != w || bimg.getHeight() != h) {

            bimg = (BufferedImage) createImage(w, h);

            reset(w, h);

        }

        g2 = bimg.createGraphics();

        g2.setBackground(getBackground());

        g2.clearRect(0, 0, w, h);

        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        return g2;

    }

    public void start() {

        thread = new Thread(this);

        thread.setPriority(Thread.MIN_PRIORITY);

        thread.start();

    }

   public void paint(Graphics g) {

     Dimension d = getSize();

        step(d.width, d.height);

        Graphics2D g2 = createGraphics2D(d.width, d.height);

        drawg2d(d.width, d.height, g2);

        g2.dispose();

        g.drawImage(bimg, 0, 0, this);

    }

    public synchronized void stop() {

        thread = null;

    }

    public void run() {

        try {

            thread.sleep(1000);

        } catch (InterruptedException e) { return; }

        Thread me = Thread.currentThread();

        while (thread == me) {

            repaint();

            try {

                thread.sleep(sleepAmount);

            } catch (InterruptedException e) { break; }

        }

        thread = null;

    }

}

C:\JavaExample\14>javac Graphics2DTest.java

C:\JavaExample\14>appletviewer Graphics2DTest.html

 

 

 Á¶±Ý ±ä °Í °°Àº ¿¹Á¦¿´½À´Ï´Ù¸¸ º°·Î ±æÁö´Â ¾ÊÁÒ? ÀÌ ¿¹Á¦´Â ½ÇÇàÇØ º¸½Ã¸é ¾Ë°ÚÁö¸¸ ±Û¾¾°¡ ½áÁø ºí·Ï ºÎºÐÀÌ Á¶±Ý¾¿ »öÀ¸·Î ä¿öÁö´Â AppletÀÌ ³ªÅ¸³³´Ï´Ù. AppletÀº ´ÙÀ½ Àå¿¡¼­ ÀÚ¼¼È÷ ¼³¸í µå¸®µµ·Ï ÇϰڽÀ´Ï´Ù. ¾Õ¿¡¼­ 13Àå AWT¿¡¼­ º¸¾Æ¿Ô´ø °Í°ú´Â Á¶±Ý ´Ù¸£´Ù°í ´À³¢½Ç °ÍÀÔ´Ï´Ù. À§ÀÇ µÎ °³ÀÇ ÆÄÀÏÀº µû·Î ÀúÀåÇÏ¼Å¾ß ÇÕ´Ï´Ù. AppletÀº html·Î ½ÃÀÛÇÕ´Ï´Ù. ±× °ÍÀÌ Æ¯ÀÌÇÑ Á¡Áß ÇϳªÀÔ´Ï´Ù. ¿¹Á¦¸¦ º¸¸é ¾Ë°ÚÁö¸¸ main()¸Þ¼­µå°¡ ¾ø½À´Ï´Ù. ´ë½Å¿¡ htmlÀÌ ·ÎµùÀ» ½ÃÄÑÁÖ¸ç óÀ½ ½ÃÀÛÀº init()¸Þ¼­µåºÎÅÍ ½ÃÀÛÇÕ´Ï´Ù.

 

 2D Graphics´Â java.awt.geomÆÐŰÁö¿¡ Àִ Ŭ·¡½ºµé·Î ¿©·¯ °¡Áö ÇüÅÂÀÇ µµÇü(°î¼±, È£, ¼±µî)µéÀ» ±×¸± ¼ö ÀÖ½À´Ï´Ù. ±×¸®°í ±× µµÇüÀ» Graphics2DŬ·¡½ºÀÇ °´Ã¼¸¦ »ç¿ëÇÏ¿© µµÇüÀÇ ±â´ÉµéÀ» ´õ¿í °­·ÂÇÏ°Ô ¸¸µé¾î ÁÝ´Ï´Ù. ¸ÕÀú java.awt.geomÆÐŰÁö¸¦ import½ÃÄÑ¾ß ÇÕ´Ï´Ù.

 

n        import java.awt.geom.Rectangle2D;

n        import java.awt.geom.AffineTransform;

 

 ¿©±â¿¡¼­´Â Á÷Á¢ Ŭ·¡½º¸¦ import½ÃÄ×½À´Ï´Ù. Rectangle2D Ŭ·¡½º´Â, À§Ä¡(x, y)¹× »çÀÌÁî(width X height)·Î Á¤ÀǵǴ »ç°¢ÇüÀ» ±â¼úÇÕ´Ï´Ù. AffineTransformŬ·¡½º´Â Ãøµµ º¯È¯À» ºñ·ÔÇØ ÁÂÇ¥°èÀÇ À̵¿ ¹× ȸÀüÀ» ¸ðµÎ Æ÷ÇÔÇÏ´Â ÁÂÇ¥º¯È¯À» Çϴ Ŭ·¡½ºÀÔ´Ï´Ù. »ç¿ëÀÚ °ø°£¿¡¼­ µð¹ÙÀ̽º °ø°£À¸·Î µµÇüÀ» ¿Å°Ü Ç¥ÇöÇÒ ¶§, affine transformÀû¿ëµË´Ï´Ù. »ç¿ëÀÚ °ø°£(User Space)À̶õ ÇÁ·Î±×·¡¸Ó ȤÀº ÇÁ·Î±×·¥¿¡¼­ »ç¿ëÇÏ´Â µð¹ÙÀ̽º µ¶¸³ÇÑ ÁÂÇ¥°ø°£À» ¸»Çϸç, µð¹ÙÀ̽º °ø°£(Device Space)À̶õ Ãâ·Â ÀåÄ¡°¡ »ç¿ëÇÏ´Â ÁÂÇ¥°ø°£ÀÔ´Ï´Ù. ¾î·Á¿öÁö³ª¿ä?

 

¶Ç ´Ù¸¥ ÆÐŰÁöÀÇ Å¬·¡½º¸¦ import½ÃÄ×½À´Ï´Ù.

 

n        import java.awt.font.TextLayout;

n        import java.awt.font.TextHitInfo;

n        import java.awt.font.FontRenderContext;

 

 TextLayoutŬ·¡½º´Â ¿©·¯°¡Áö ±â´ÉÀÌ ÀÖ½À´Ï´Ù¸¸ ¿©±â¿¡¼­´Â Ä¿¼­ÀÇ À§Ä¡ ÁöÁ¤°ú À̵¿ ±â´ÉÀ» ÇÏ´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù. TextHitInfo Ŭ·¡½º´Â ÅØ½ºÆ® ¸ðµ¨³»ÀÇ ¹®ÀÚÀÇ À§Ä¡ ¹× ±× ¹®ÀÚÀÇ bias or side¸¦ ³ªÅ¸³À´Ï´Ù. bias´Â, leading(¿ÞÂÊ¿¡¼­ ¿À¸¥ÂÊÀ¸·Î ±â¼úÇÏ´Â ¹®ÀÚÀÇ ¿ÞÂÊ ³¡) ¶Ç´Â trailing(¿ÞÂÊ¿¡¼­ ¿À¸¥ÂÊÀ¸·Î ±â¼úÇÏ´Â ¹®ÀÚÀÇ ¿À¸¥ÂÊ ³¡)ÀÇ ¾î´À ÂÊÀΰ¡ ÀÔ´Ï´Ù. TextHitInfoŬ·¡½ºÀÇ °´Ã¼´Â ÅØ½ºÆ®³»ÀÇ ±ÛÀÚ ¹× »ðÀÔ À§Ä¡¸¦ ÁöÁ¤Çϱâ À§Çؼ­ »ç¿ëµË´Ï´Ù. FontRenderContextŬ·¡½º´Â ÅØ½ºÆ®ÀÇ size¸¦ ¿Ã¹Ù¸£°Ô ÃøÁ¤Çϴµ¥ ÇÊ¿äÇÑ Á¤º¸ÀÇ ÄÁÅ×À̳ÊÀÔ´Ï´Ù. ÅØ½ºÆ®ÀÇ size´Â ¾Æ¿ìÆ®¶óÀÎÀ» Çȼ¿¿¡ Ç¥½ÃÇÏ´Â ±ÔÄ¢À̳ª, ¾îÇø®ÄÉÀ̼ÇÀÌ Á¦°øÇϴ ǥÇö ÈùÆ®¿¡ ÀÇÇØ ¹Ù²î´Â °æ¿ì°¡ ÀÖ½À´Ï´Ù. ±×·¸Áö¸¸ À§ÀÇ Å¬·¡½º°¡ ¼³¸íµå¸° ±â´É¸¸ ÇÏ´Â °ÍÀÌ ¾Æ´ÔÀ» ¾Æ¼Å¾ß ÇÕ´Ï´Ù.

 

n        public class Graphics2DTest extends Applet implements Runnable { }

 

 ¿¹Á¦°¡ AppletÀ» »ó¼Ó¹Þ¾Ò½À´Ï´Ù. ±×¸®°í RunnableÀÎÅÍÆäÀ̽º¸¦ implementsÇÏ¿´½À´Ï´Ù. ¿©±â¼­´Â ƯÀÌÇÏ°Ô final·Î ÁöÁ¤Çϰí ÀÖ´Â µ¥ ±× ÀÌÀ¯´Â ½Ã°£ÀÇ È帧¿¡ µû¶ó ½º·¹µå¹Ù°¡ º¯Çϴµ¥ º¯ÇÏ´Â µ¿¾È ½º·¹µå¹Ù¸¦ Á¦¿ÜÇÑ ÅØ½ºÆ®µé°ú TextLayout, Font, ½º·¹µå¹ÙÀÇ Color µîÀÌ º¯ÇÏÁö ¾Ê°Ô Çϱâ À§Çؼ­ ÀÔ´Ï´Ù.

 À§¿¡¼­ AppletÀº html·Î ½ÃÀÛÇÑ´Ù°í ¸»Çß½À´Ï´Ù. ±×¸®°í ½ÃÀÛÀº init()¸Þ¼­µåºÎÅÍ ÀÔ´Ï´Ù.

 

n        public void init() { }

 

 ÀÌÁ¦ init()¸Þ¼­µåºÎÅÍ ½ÃÀÛÇØ º¼±î¿ä? Âü, AppletÀº ÁÖ±â¶ó´Â °ÍÀÌ ÀÖ½À´Ï´Ù. init() ¡æ start() ¡æ paint() ¡æ stop() ¡æ destroy() ÀÌ·¸°Ô ÀÚµ¿À¸·Î ½ÇÇàÀÌ µË´Ï´Ù. Æí¸®ÇÑ ³ðÀÌÁÒ. init()¸Þ¼­µå ¾È¿¡¼­ °´Ã¼¸¦ »ý¼º½ÃÄ×½À´Ï´Ù.

 

n        public void init() {

n           final Graphics2DTest g2d = new Graphics2DTest();

n           setBackground(Color.white);

n           fonts = new Font[2];

n           layouts = new TextLayout[fonts.length];

n           curPos = new int[fonts.length];

n        }

 

 ¿©±â¿¡¼­ »ý¼ºµÈ 3°³ÀÇ °´Ã¼¿¡¼­ fonts´Â µÎ °³ÀÇ ÆùÆ®¹è¿­À» ³ªÅ¸³»°í, layoutÀº ÆùÆ®¹è¿­ÀÇ °³¼ö¸¸Å­ TextLayout¹è¿­À» ³ªÅ¸³»¸ç, curPos´Â ÆùÆ®¹è¿­ÀÇ °³¼ö¸¸Å­ÀÇ intÇü ¹è¿­ÀÔ´Ï´Ù.

 init()¸Þ¼­µå´Â ÀÚµ¿À¸·Î start()¸Þ¼­µå¸¦ È£ÃâÇÕ´Ï´Ù. È£ÃâµÈ start()¸Þ¼­µå¿¡¼­ thread¸¦ »ý¼ºÇϰí, ÀÌ thread¸¦ start½ÃÄ×½À´Ï´Ù.

 

n        public void start() {

n           thread = new Thread(this);

n           thread.setPriority(Thread.MIN_PRIORITY);

n           thread.start();

n        }

 

 ¿©±â¿¡¼­ óÀ½¿¡ ½ÇÇàµÈ ¸Þ¼­µå´Â AppletÀÇ start()¸Þ¼­µåÀ̰í, ±× ¾È¿¡¼­ È£ÃâµÈ start()¸Þ¼­µå´Â ThreadÀÇ start()¸Þ¼­µåÀÔ´Ï´Ù. ThreadÀÇ start()¸Þ¼­µå´Â run()¸Þ¼­µå¸¦ È£ÃâÇÕ´Ï´Ù. ¾Ë°í °è½ÃÁÒ?

 

n        public void run() {

n           try {

n              thread.sleep(1000);

n           } catch (InterruptedException e) { return; }

n           Thread me = Thread.currentThread();

n           while (thread == me) {

n              repaint();

n              try {

n                 thread.sleep(sleepAmount);

n              } catch (InterruptedException e) { break; }

n           }

n           thread = null;

n        }

 

 ¿©±â¿¡¼­ threadÀÇ Á¤Áö½Ã°£À» 1000ms(1ÃÊ)À¸·Î ÁÖ°í ÇöÀç ½ÇÇàÁßÀÎ thread°¡ ÀÚ±âÀÇ °ÍÀ̶ó¸é repaintÇØÁÝ´Ï´Ù. ±×¸®°í Á¤ÇØÁØ ½Ã°£¸¸Å­ ¶Ç Á¤ÁöÇÏ°Ô µÇ´Â °ÅÁÒ.

 

 À§¿¡¼­ AppletÀÇ start()¸Þ¼­µå¸¦ È£ÃâÇÏ¿´´Âµ¥, ÀÌ ¸Þ¼­µå´Â paint(Graphics g)¸Þ¼­µå¸¦ È£ÃâÇÏ°Ô µË´Ï´Ù.

 

n        public void paint(Graphics g) {

n           Dimension d = getSize();

n           step(d.width, d.height);

n           Graphics2D g2 = createGraphics2D(d.width, d.height);

n           drawg2d(d.width, d.height, g2);

n           g2.dispose();

n           g.drawImage(bimg, 0, 0, this);

n        }

 

 ÀÌ paint(Graphics g)¸Þ¼­µå°¡ °¡Àå ÇÙ½ÉÀûÀÎ ºÎºÐÀÔ´Ï´Ù. ¸ÕÀú getSize()¸Þ¼­µå¸¦ »ç¿ëÇÏ¿© DimensionŬ·¡½ºÀÇ °´Ã¼ d¸¦ ¸¸µé¾ú½À´Ï´Ù. ±×¸®°í d.width¿Í d.height¸¦ ¸Å°³º¯¼ö·Î »ç¿ëÇÏ¿© step()¸Þ¼­µå¸¦ È£ÃâÇÏ¿´½À´Ï´Ù. ±×¸®°í createGraphics2D(d.width, d.height)¸Þ¼­µå¸¦ »ç¿ëÇÏ¿© Graphics2DŬ·¡½ºÀÇ °´Ã¼ g2¸¦ »ý¼ºÇÏ¿´½À´Ï´Ù.

 

n        public Graphics2D createGraphics2D(int w, int h) {

n           Graphics2D g2 = null;

n           if (bimg == null || bimg.getWidth() != w || bimg.getHeight() != h) {

n              bimg = (BufferedImage) createImage(w, h);

n              reset(w, h);

n           }

n           g2 = bimg.createGraphics();

n           g2.setBackground(getBackground());

n           g2.clearRect(0, 0, w, h);

n           g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,  RenderingHints.VALUE_ANTIALIAS_ON);

n           return g2;

n        }

 

 ÀÌ ¸Þ¼­µå ¼ÓÀ» µé¿©´Ù º¸°Ú½À´Ï´Ù. ¸ÕÀú if¹®À» »ç¿ëÇÏ¿© BufferedImageŬ·¡½ºÀÇ bimg°´Ã¼°¡ null°ªÀ» °®°Å³ª, À̹ÌÁöÀÇ Å©±â°¡ ´Ù¸£´Ù¸é reset(w, h)¸Þ¼­µå¸¦ »ç¿ëÇØ¼­ ÆùÆ®¹è¿­°´Ã¼¸¦ »ý¼ºÇϰí ÀÖ½À´Ï´Ù. BufferedImageŬ·¡½ºÀÇ ¸â¹ö¸Þ¼­µåÀÎ createGraphics()¸¦ »ç¿ëÇÏ¿© Graphics2DŬ·¡½ºÀÇ °´Ã¼ g2¸¦ »ý¼ºÇÏ¿´½À´Ï´Ù. ÀÌ·¸°Ô »ý¼ºµÈ Graphics2DŬ·¡½ºÀÇ g2·Î setBackground(getBackground())¸Þ¼­µå¸¦ »ç¿ëÇÏ¿© Graphics2D ¹®¸ÆÀÇ ¹é±×¶ó¿îµå Ä®¶ó¸¦ ¼³Á¤ÇÕ´Ï´Ù. ¹é±×¶ó¿îµå Ä®¶ó´Â, ¿µ¿ªÀ» clearÇϱâ À§Çؼ­ »ç¿ëµË´Ï´Ù. ±× ÈÄ clearRect()¸Þ¼­µå¸¦ »ç¿ëÇÏ¿© ¿µ¿ªÀ» clearÇÏ¿´½À´Ï´Ù. ±×¸®°í setRenderingHint()¸Þ¼­µå¸¦ »ç¿ëÇÏ¿© Ç¥Çö ¾Ë°í¸®ÁòÀÇ Ãßõ ¼³Á¤ÀÇ °ªÀ» 1°³ ¼³Á¤ÇÏ¿´ÁÒ. ±× ÈÄ °´Ã¼ g2¸¦ ¸®ÅÏ ½ÃÄ×½À´Ï´Ù.

 

 ´Ù½Ã paint()¸Þ¼­µå·Î µ¹¾Æ¿Í¼­ d.width, d.height, ±×¸®°í g2¸¦ ¸Å°³º¯¼ö·Î ½á¼­ drawg2d()¸Þ¼­µå¸¦ È£ÃâÇÏ¿´½À´Ï´Ù.

 

n        public void drawg2d(int w, int h, Graphics2D g2) { }

 

 ±×¸®°í g2.getFontRenderContext()¸Þ¼­µå¸¦ »ç¿ëÇÏ¿© FontRenderContextŬ·¡½ºÀÇ °´Ã¼ frc¸¦ »ý¼ºÇÏ¿´½À´Ï´Ù. getFontRenderContext()¸Þ¼­µå´Â Graphics2DŬ·¡½º ¹®¸Æ¿¡¼­ÀÇ FontÀÇ Ç¥Çö ¹®¸ÆÀ» ¸®ÅÏ ÇÕ´Ï´Ù. ¸»ÀÌ Á» ¾î·Æ±º¿ä. ±×³É Ç¥ÇöÇØ¾ß ÇÏ´Â Á¤º¸¸¦ ¹ÝȯÇÏ´Â Á¤µµ·Î »ý°¢Çϼŵµ ¹«¹æÇÒ µí½Í½À´Ï´Ù. ±×¸®°í for¹®À» »ç¿ëÇÏ¿© ¿©·¯ °¡Áö °ªµé°ú ¸Þ¼­µåµéÀ» È£ÃâÇÏ¿´½À´Ï´Ù. 

 

n        FontRenderContext frc = g2.getFontRenderContext();

n        for (int i = 0; i < 2; i++) {

n           //¿©·¯ °¡Áö °ª°ú ¸Þ¼­µåµéÀÌ µé¾î°©´Ï´Ù.

n         }

 

 ¸ÕÀú layouts°´Ã¼¹è¿­À» ±¸Çß½À´Ï´Ù. TextLayoutŬ·¡½ºÀÇ »ý¼ºÀÚ¸Þ¼­µå¸¦ ÀÌ¿ëÇÏ¿© °ªÀ» °áÁ¤ÇÏ¿´½À´Ï´Ù. ±×¸®°í ´Ù¸¥ ¸Þ¼­µåµéÀÇ ¸Å°³º¯¼öÀÇ °ªµéÀ» ±¸Çß½À´Ï´Ù.

 

n           layouts[i] = new TextLayout(text[i], fonts[i], frc);

n           float rx = (float) (w/2-layouts[i].getBounds().getWidth()/2);

n           float ry = (float) ((i == 0) ? h/3 : h * 0.75f);

n           float rw = (float) (layouts[i].getBounds().getWidth());

n           float rh = (float) (layouts[i].getBounds().getHeight());

 

 °è¼ÓÇØ¼­ getLogicalHighlightShape(int firstEndpoint, int secondEndpoint)¸Þ¼­µå¸¦ »ç¿ëÇØ¼­ ÁöÁ¤µÈ ¹üÀ§ÀÇ ³í¸®ÀûÀÎ ¼±Åà ¹üÀ§¸¦ µÑ·¯½Î´Â Shape¸¦, ÀÌ TextLayoutÀÇ ÀÚ¿¬ °æ°è±îÁö È®ÀåÇØ µ¹·ÁÁÝ´Ï´Ù. ±×¸®°í AffineTransformŬ·¡½ºÀÇ TranslateInstance(double tx, double ty)¸Þ¼­µå¸¦ »ç¿ëÇÏ¿© ÆòÇàÀ̵¿ º¯È¯À» Ç¥ÇöÇÏ´Â º¯È¯À» ¾ò¾î³»°í, createTransformedShape(Shape pSrc)¸Þ¼­µå¸¦ »ç¿ëÇÏ¿© ÁöÁ¤µÈ Shape¸¦ ÀÌ º¯È¯¿¡ ÀÇÇØ º¯È¯ÇØ, ±× ShapeÀÇ ±¸Á¶¿¡ ÀÇÇØ Á¤ÀÇ µÇ´Â »õ·Î¿î ShapeŬ·¡½ºÀÇ °´Ã¼¸¦ µ¹·ÁÁÝ´Ï´Ù.

 

n           Shape hilite = layouts[i].getLogicalHighlightShape(0, curPos[i]);

n           AffineTransform at = AffineTransform.getTranslateInstance(rx, ry);

n           hilite = at.createTransformedShape(hilite);

 

 ¶Ç ¿©±â¼­, ¸Þ¼­µå¿¡ »ç¿ëµÉ ¸Å°³º¯¼ö¸¦ ±¸Çß½À´Ï´Ù. getBound()¸Þ¼­µå´Â Shape¸¦ ¿ÏÀüÇÏ°Ô µÑ·¯½Î´Â Á¤¼öÀÇ RectangleÀ» ¹ÝȯÇÕ´Ï´Ù

 

n           float hy = (float) hilite.getBounds().getY();

n           float hh = (float) hilite.getBounds().getHeight();

 

 ±× ´ÙÀ½ »öÀ» ¼³Á¤Çϰí, ±× µµÇüÀÇ ³»ºÎ¸¦ »öÄ¥À» ÇÕ´Ï´Ù. ±×¸®°í ¹®ÀÚ¿Í RectangleÀ» ±×·ÁÁÝ´Ï´Ù.

 

n           g2.setColor(colors[i]);

n           g2.fill(hilite);

n           Shape[] shapes = layouts[i].getCaretShapes(curPos[i]);

n           Shape caret = at.createTransformedShape(shapes[0]);

n           g2.setColor(Color.black);

n           layouts[i].draw(g2, rx, ry);

n           g2.draw(caret);

n           g2.draw(new Rectangle2D.Float(rx,hy,rw,hh));

 

 ÀÌ·¸°Ô paint(Graphics g)¸Þ¼­µå¸¦ ¼³¸íÇÏ¿´½À´Ï´Ù. Á¤¸» ±æ±º¿ä. Thread°¡ repaint()¸Þ¼­µå¸¦ È£ÃâÇÏ¸é ´Ù½Ã paint(Graphics g)¸Þ¼­µå¸¦ ½ÇÇà½ÃÄÑÁÖ¸é µË´Ï´Ù.

 

»ó´çÈ÷ ¾î·Á¿î ¿¹Á¦¿´½À´Ï´Ù. ÇÏÁö¸¸ õõÈ÷ ´Ù½Ã »ìÆìº¸¸é óÀ½º¸´Ù´Â ½±°ÚÁÒ. Graphics2DŬ·¡½º´Â GraphicsŬ·¡½º¸¦ »ó¼Ó ¹Þ¾Æ »ý¼ºµÈ Ŭ·¡½ºÀÔ´Ï´Ù. ±×·¡¼­ GraphicsŬ·¡½ºÀÇ ¸ðµç ¸â¹ö ¸Þ¼­µå¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. °Å±â¿¡ ÀÚ±âÀÇ ¸Þ¼­µåµéÀÌ ´õÇØÁö°í java.awt.geomÆÐŰÁö³ª java.awt.fontÆÐŰÁöÀÇ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ¿© °­·ÂÇÑ ±â´ÉÀ» ³ªÅ¸³»°í ÀÖ½À´Ï´Ù. ¸Þ¼­µåµéÀÇ ¹ÝȯÇüµéÀÌ »ý¼ÒÇÑ Å¸ÀÔµéÀÌ ¸¹ÀÌ ³ª¿À´Â ÆíÀÔ´Ï´Ù. ±×·¡¼­ ¸¹ÀÌµé ¾î·Á¿öÇÕ´Ï´Ù.  ÇÏÁö¸¸ »ç¿ë¸¸ ÇÒ ¼ö ÀÖ´Ù¸é ´õ¿í ¸ÚÁø GraphicÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.



jabookÀúÀÚ¸íÇÔ
Á¦¸ñ:¼Ò¼³°°ÀºÀÚ¹Ù3ºÎ
ÀúÀÚ:ÃÖ¿µ°ü