JavaTM Platform
Standard Ed. 6

java.awt.font
클래스 LineBreakMeasurer

java.lang.Object 
  상위를 확장 java.awt.font.LineBreakMeasurer


public final class LineBreakMeasurer
extends Object

LineBreakMeasurer 클래스를 사용하면, 서식 첨부 텍스트를, 특정의 가시 유효폭에 들어가는 행 (또는 세그먼트(segment))으로 나눌 수가 있습니다. 이것은, 고유의 폭 (랩핑폭으로 불린다)에 들어가는 텍스트의 단락을 클라이언트에 표시하는 경우에 편리합니다.  

LineBreakMeasurer 는, 서식 첨부 텍스트에 대한 반복자를 사용해 구축됩니다. 반복자의 범위는 텍스트내의 1 개의 단락입니다. LineBreakMeasurer 는, 다음의 텍스트 세그먼트(segment)를 개시하기 위해서, 텍스트내의 위치를 포함합니다. 처음은, 이 정도치가 텍스트의 시점입니다. 단락의 방향은, 쌍방향 포맷 규칙에 따라, 전방향 (왼쪽에서 오른쪽 또는 오른쪽에서 왼쪽)에 이릅니다. 단락으로부터 취득된 모든 세그먼트(segment)는, 그 단락과 같은 방향이 됩니다.  

텍스트의 세그먼트(segment)는,nextLayout 메소드를 호출하는 것으로 취득됩니다. 이 메소드는, 랩핑폭에 들어가는 텍스트를 나타내는 TextLayout 를 돌려줍니다. nextLayout 메소드는,nextLayout 가 돌려준 레이아웃의 구석에 현재의 위치를 이동합니다.  

LineBreakMeasurer 는, 가장 일반적인 다음의 개행을 구현합니다. 랩핑폭에 들어가는 모든 단어는, 같은 행에 배치됩니다. 최초의 단어가 수습되지 않으면, 랩핑폭에 들어갈 뿐(만큼)의 문자가 그 행에 배치됩니다. 각 행에는 적어도 1 문자가 배치됩니다.  

LineBreakMeasurer 에 의해 반환되는 TextLayout 의 인스턴스는, 탭을 폭 0 의 스페이스와 같게 취급합니다. 위치 결정을 위해서(때문에) 탭 단락의 세그먼트(segment)를 취득하는 클라이언트는, 텍스트에 대한 리밋트 오프셋(offset)를 취하는 nextLayout 의 overload를 사용하도록 해 주세요. 리밋트 오프셋(offset)는, 탭 이후의 최초의 문자입니다. 이 메소드가 돌려주는 TextLayout 객체는, 지정된 리밋트 (현재의 위치와 리밋트와의 사이의 텍스트가 랩핑폭에 들어가지 않는 경우에는, 리밋트의 전)로 끝납니다.  

탭 단락의 텍스트를 레이아웃 하는 클라이언트에는, 최초의 세그먼트(segment)를 행에 배치한 뒤, 약간 다른 개행 정책가 필요합니다. 나머지의 영역에 일부의 단어를 거두는 것이 아니라, 전체를 다음의 행에 배치합니다. 정책의 이 변경은,boolean 파라미터를 취하는 nextLayout 의 overload로 요구할 수 있습니다. 이 파라미터가 true 의 경우,nextLayout 는, 최초의 단어가 지정된 영역에 들어가지 않을 때에 null 를 돌려줍니다. 아래와 같은 탭 샘플을 참조해 주세요.  

일반적으로,LineBreakMeasurer 의 작성에 사용된 텍스트가 변경되었을 경우는, 변경을 반영하기 위해서 새로운 LineBreakMeasurer 를 작성할 필요가 있습니다 (지금까지의 LineBreakMeasurer 는 그대로 정상적으로 동작하지만, 텍스트의 변경에는 대응하지 않는다). 다만, 텍스트의 변경이 1 문자의 삽입 또는 삭제의 경우에는,insertChar 또는 deleteChar 를 호출해, 기존의 LineBreakMeasurer 를 「갱신」해도 괜찮습니다. 기존의 LineBreakMeasurer 를 갱신하는 (분)편이, 새롭게 작성하는 것보다도 처리 시간이 걸리지 않습니다. 사용자의 키 입력에 의해 텍스트를 변경하는 경우는, 이러한 방법을 이용하면(자) 좋을 것입니다.  

:

컴퍼넌트에 단락을 draw 합니다.

 public void paint(Graphics graphics) {

     Point2D pen = new Point2D(10, 20);
     Graphics2D g2d = (Graphics2D) graphics;
     FontRenderContext frc = g2d.getFontRenderContext();

     // let styledText be an AttributedCharacterIterator containing at least
     // one character

     LineBreakMeasurer measurer = new LineBreakMeasurer(styledText, frc);
     float wrappingWidth = getSize(). width - 15;

     while (measurer.getPosition() < fStyledText.length()) {

         TextLayout layout = measurer.nextLayout(wrappingWidth);

         pen.y += (layout.getAscent());
         float dx = layout.isLeftToRight() ?
             0 : (wrappingWidth - layout.getAdvance());

         layout.draw(graphics, pen.x + dx, pen.y);
         pen.y += layout.getDescent() + layout.getLeading();
     }
 }
 

탭 첨부의 텍스트를 draw 합니다. 알기 쉽게하기 위해(때문에), 텍스트의 방향은 모두 왼쪽에서 오른쪽으로 합니다.

 public void paint(Graphics graphics) {

     float leftMargin = 10, rightMargin = 310;
     float[] tabStops = { 100, 250 };

     // assume styledText is an AttributedCharacterIterator, and the number
     // of tabs in styledText is tabCount

     int[] tabLocations = new int[tabCount+1];

     int i = 0;
     for (char c = styledText.first(); c ! = styledText.DONE; c = styledText.next()) {
         if (c == '\t') {
             tabLocations[i++] = styledText.getIndex();
         }
     }
     tabLocations[tabCount] = styledText.getEndIndex() - 1;

     // Now tabLocations has an entry for every tab's offset in
     // the text.   For convenience, the last entry is tabLocations
     // is the offset of the last character in the text.

     LineBreakMeasurer measurer = new LineBreakMeasurer(styledText);
     int currentTab = 0;
     float verticalPos = 20;

     while (measurer.getPosition() < styledText.getEndIndex()) {

         // Lay out and draw each line.   All segments on a line
         // must be computed before any drawing can occur, since
         // we must know the largest ascent on the line.
         // TextLayouts are computed and stored in a Vector;
         // their horizontal positions are stored in a parallel
         // Vector.

         // lineContainsText is true after first segment is drawn
         boolean lineContainsText = false;
         boolean lineComplete = false;
         float maxAscent = 0, maxDescent = 0;
         float horizontalPos = leftMargin;
         Vector layouts = new Vector(1);
         Vector penPositions = new Vector(1);

         while (! lineComplete) {
             float wrappingWidth = rightMargin - horizontalPos;
             TextLayout layout =
                     measurer.nextLayout(wrappingWidth,
                                         tabLocations[currentTab]+1,
                                         lineContainsText);

             // layout can be null if lineContainsText is true
             if (layout ! = null) {
                 layouts.addElement(layout);
                 penPositions.addElement(new Float(horizontalPos));
                 horizontalPos += layout.getAdvance();
                 maxAscent = Math.max(maxAscent, layout.getAscent());
                 maxDescent = Math.max(maxDescent,
                     layout.getDescent() + layout.getLeading());
             } else {
                 lineComplete = true;
             }

             lineContainsText = true;

             if (measurer.getPosition() == tabLocations[currentTab]+1) {
                 currentTab++;
             }

             if (measurer.getPosition() == styledText.getEndIndex())
                 lineComplete = true;
             else if (horizontalPos >= tabStops[tabStops.length-1])
                 lineComplete = true;

             if (! lineComplete) {
                 // move to next tab stop
                 int j;
                 for (j=0; horizontalPos >= tabStops[j]; j++) {}
                 horizontalPos = tabStops[j];
             }
         }

         verticalPos += maxAscent;

         Enumeration layoutEnum = layouts.elements();
         Enumeration positionEnum = penPositions.elements();

         // now iterate through layouts and draw them
         while (layoutEnum.hasMoreElements()) {
             TextLayout nextLayout = (TextLayout) layoutEnum.nextElement();
             Float nextPosition = (Float) positionEnum.nextElement();
             nextLayout.draw(graphics, nextPosition.floatValue(), verticalPos);
         }

         verticalPos += maxDescent;
     }
 }
 

관련 항목:
TextLayout

생성자 의 개요
LineBreakMeasurer (AttributedCharacterIterator  text, BreakIterator  breakIter, FontRenderContext  frc)
          지정된 텍스트에 대한 LineBreakMeasurer 를 구축합니다.
LineBreakMeasurer (AttributedCharacterIterator  text, FontRenderContext  frc)
          지정된 텍스트에 대한 LineBreakMeasurer 를 구축합니다.
 
메소드의 개요
 void deleteChar (AttributedCharacterIterator  newParagraph, int deletePos)
          텍스트로부터 문자가 1 개 삭제된 뒤에 LineBreakMeasurer 를 갱신해, 현재의 위치를 그 단락의 선두로 설정합니다.
 int getPosition ()
          LineBreakMeasurer 의 현재의 위치를 돌려줍니다.
 void insertChar (AttributedCharacterIterator  newParagraph, int insertPos)
          텍스트에 문자가 1 개 삽입된 뒤에 LineBreakMeasurer 를 갱신해, 현재의 위치를 그 단락의 선두로 설정합니다.
 TextLayout nextLayout (float wrappingWidth)
          다음의 레이아웃을 돌려주어, 현재의 위치를 갱신합니다.
 TextLayout nextLayout (float wrappingWidth, int offsetLimit, boolean requireNextWord)
          다음의 레이아웃을 돌려주어, 현재의 위치를 갱신합니다.
 int nextOffset (float wrappingWidth)
          다음의 레이아웃의 마지막 위치를 돌려줍니다.
 int nextOffset (float wrappingWidth, int offsetLimit, boolean requireNextWord)
          다음의 레이아웃의 마지막 위치를 돌려줍니다.
 void setPosition (int newPosition)
          LineBreakMeasurer 의 현재의 위치를 설정합니다.
 
클래스 java.lang. Object 로부터 상속된 메소드
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
 

생성자 의 상세

LineBreakMeasurer

public LineBreakMeasurer(AttributedCharacterIterator  text,
                         FontRenderContext  frc)
지정된 텍스트에 대한 LineBreakMeasurer 를 구축합니다.

파라미터:
text - 이 LineBreakMeasurerTextLayout 객체의 생성 대상으로 하는 텍스트. 이 텍스트에는, 1 개(살) 이상의 문자가 포함되어 있지 않으면 안 된다. iter 로 얻을 수 있는 텍스트가 변경되었을 경우, 그 후의 이 LineBreakMeasurer 의 인스턴스에의 호출의 결과는 보증되지 않는다 (다만, 나중에 insertChar 또는 deleteChar 를 호출하는 경우를 제외하다. 관련 항목을 참조)
frc - 텍스트를 정확하게 측정하기 위해서 필요한 그래픽스 디바이스에 관한 정보를 포함한다. 텍스트 측정은, 디바이스의 해상도에 의해 조금 달라, 에일리어징 제거등의 속성에 따라서 다르다. 이 파라미터는, LineBreakMeasurer 와 사용자 공간의 사이의 이동은 지정하지 않는
관련 항목:
insertChar(java.text.AttributedCharacterIterator, int) , deleteChar(java.text.AttributedCharacterIterator, int)

LineBreakMeasurer

public LineBreakMeasurer(AttributedCharacterIterator  text,
                         BreakIterator  breakIter,
                         FontRenderContext  frc)
지정된 텍스트에 대한 LineBreakMeasurer 를 구축합니다.

파라미터:
text - 이 LineBreakMeasurerTextLayout 객체의 생성 대상으로 하는 텍스트. 이 텍스트에는, 1 개(살) 이상의 문자가 포함되어 있지 않으면 안 된다. iter 로 얻을 수 있는 텍스트가 변경되었을 경우, 그 후의 이 LineBreakMeasurer 의 인스턴스에의 호출의 결과는 보증되지 않는다 (다만, 나중에 insertChar 또는 deleteChar 를 호출하는 경우를 제외하다. 관련 항목을 참조)
breakIter - 개행을 정의한다 BreakIterator
frc - 텍스트를 정확하게 측정하기 위해서 필요한 그래픽스 디바이스에 관한 정보를 포함한다. 텍스트 측정은, 디바이스의 해상도에 의해 조금 달라, 에일리어징 제거등의 속성에 따라서 다르다. 이 파라미터는, LineBreakMeasurer 와 사용자 공간의 사이의 이동은 지정하지 않는다
예외:
IllegalArgumentException - 텍스트가 1 문자에 못 미친 경우
관련 항목:
insertChar(java.text.AttributedCharacterIterator, int) , deleteChar(java.text.AttributedCharacterIterator, int)
메소드의 상세

nextOffset

public int nextOffset(float wrappingWidth)
다음의 레이아웃의 마지막 위치를 돌려줍니다. LineBreakMeasurer 의 현재의 위치를 갱신하지 않습니다.

파라미터:
wrappingWidth - 다음의 레이아웃내의 텍스트에 허용 되는 최대의 가시 유효폭
반환값:
다음의 TextLayout 의 리밋트를 나타내는 텍스트내의 좌표

nextOffset

public int nextOffset(float wrappingWidth,
                      int offsetLimit,
                      boolean requireNextWord)
다음의 레이아웃의 마지막 위치를 돌려줍니다. LineBreakMeasurer 의 현재의 위치를 갱신하지 않습니다.

파라미터:
wrappingWidth - 다음의 레이아웃내의 텍스트에 허용 되는 최대의 가시 유효폭
offsetLimit - 리밋트 이후의 텍스트가 랩핑폭에 들어가는 경우에서도, 다음의 레이아웃에 포함되지 않는 최초의 문자. offsetLimit 는, 현재의 위치보다 크지 않으면 안 되는
requireNextWord - true 의 경우, 다음의 단어 전체가 wrappingWidth 에 들어가지 않을 때는 현재의 위치가 반환된다. false 의 경우, 반환되는 좌표는 현재의 위치보다 적어도 1 크다
반환값:
다음의 TextLayout 의 리밋트를 나타내는 텍스트내의 좌표

nextLayout

public TextLayout  nextLayout(float wrappingWidth)
다음의 레이아웃을 돌려주어, 현재의 위치를 갱신합니다.

파라미터:
wrappingWidth - 다음의 레이아웃내의 텍스트에 허용 되는 최대의 가시 유효폭
반환값:
wrappingWidth 에 들어가는 다음의 행을 나타내, 현재의 위치로부터 시작된다 TextLayout

nextLayout

public TextLayout  nextLayout(float wrappingWidth,
                             int offsetLimit,
                             boolean requireNextWord)
다음의 레이아웃을 돌려주어, 현재의 위치를 갱신합니다.

파라미터:
wrappingWidth - 다음의 레이아웃내의 텍스트에 허용 되는 최대의 가시 유효폭
offsetLimit - 리밋트 이후의 텍스트가 랩핑폭에 들어가는 경우에서도, 다음의 레이아웃에 포함되지 않는 최초의 문자. offsetLimit 는, 현재의 위치보다 크지 않으면 안 되는
requireNextWord - true 의 경우, 현재의 위치에 있는 단어 전체가 랩핑폭에 들어가지 않을 때는 null 가 반환된다. false 의 경우, 적어도 현재의 위치에 있는 문자를 포함한, 유효한 레이아웃이 반환된다
반환값:
wrappingWidth 에 들어가는 다음의 행을 나타내, 현재의 위치로부터 시작된다 TextLayout. 현재의 위치가, LineBreakMeasurer 의 사용하는 텍스트의 끝에 있는 경우, null 가 반환된다.

getPosition

public int getPosition()
LineBreakMeasurer 의 현재의 위치를 돌려줍니다.

반환값:
LineBreakMeasurer 의 현재의 위치
관련 항목:
setPosition(int)

setPosition

public void setPosition(int newPosition)
LineBreakMeasurer 의 현재의 위치를 설정합니다.

파라미터:
newPosition - LineBreakMeasurer 의 현재의 위치. 이 정도치는, LineBreakMeasurer 를 작성하기 위해서 사용되는 텍스트 (또는 insertChar 인가 deleteChar 에 마지막에 건네받은 텍스트) 안에 있는
관련 항목:
getPosition()

insertChar

public void insertChar(AttributedCharacterIterator  newParagraph,
                       int insertPos)
텍스트에 문자가 1 개 삽입된 뒤에 LineBreakMeasurer 를 갱신해, 현재의 위치를 그 단락의 선두로 설정합니다.

파라미터:
newParagraph - 삽입 후의 텍스트
insertPos - 텍스트내의, 문자가 삽입된 위치
예외:
IndexOutOfBoundsException - insertPosnewParagraph 의 개시 위치보다 전, 또는 newParagraph 의 종료 위치와 같은가, 그 이후인 경우
NullPointerException - newParagraphnull 의 경우
관련 항목:
deleteChar(java.text.AttributedCharacterIterator, int)

deleteChar

public void deleteChar(AttributedCharacterIterator  newParagraph,
                       int deletePos)
텍스트로부터 문자가 1 개 삭제된 뒤에 LineBreakMeasurer 를 갱신해, 현재의 위치를 그 단락의 선두로 설정합니다.

파라미터:
newParagraph - 삭제 후의 텍스트
deletePos - 텍스트내의, 문자가 삭제된 위치
예외:
IndexOutOfBoundsException - deletePosnewParagraph 의 개시 위치보다 전, 또는 newParagraph 의 종료 위치에서(보다) 뒤인 경우
NullPointerException - newParagraphnull 의 경우
관련 항목:
insertChar(java.text.AttributedCharacterIterator, int)

JavaTM Platform
Standard Ed. 6

버그의 보고와 기능의 요청
한층 더 자세한 API 레퍼런스 및 개발자 문서에 대해서는,Java SE 개발자용 문서를 참조해 주세요. 개발자전용의 상세한 해설, 개념의 개요, 용어의 정의, 버그의 회피책, 및 코드 실례가 포함되어 있습니다.

Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.