ÀÚ¹Ù 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ºÎ ÀúÀÚ:ÃÖ¿µ°ü |