2010-05-17 2 views
3

Java Swing 응용 프로그램에서 인보이스를 인쇄하려고합니다. 나는 Printable을 확장하고 public int print(Graphics g, PageFormat pf, int page) 메소드를 구현함으로써 그렇게한다.어떻게 Java2D에서 문자열을 클립핑하고 추가 할 수 있습니까? 결국 ...?

문자열에 문자열을 그리고 싶습니다. 문자열을 길게하면 클립을 붙이고 "..."로 끝내고 싶습니다. 어떻게 문자열을 측정하고 올바른 위치에서 클립 할 수 있습니까?

내 코드의 일부를 :

Font headline = new Font("Times New Roman", Font.BOLD, 14); 
g2d.setFont(headline); 
FontMetrics metrics = g2d.getFontMetrics(headline); 
g2d.drawString(myString, 0, 20); 

즉 내가 최대 120 픽셀로 myString을 제한 할 수 있습니까?

metrics.stringWidth(myString)을 사용할 수는 있지만 문자열을 클립해야하는 위치를 얻지 못합니다.

예상 결과가 될 수있다 : 당신이 문자열이 잘린 될 필요가 있음을 알게되면

A longer string that exc... 
A shorter string. 
Another long string, but OK 

답변

1

당신은 문자 당 평균 폭을 얻을 문자 수로 나눈 stringWidth을 복용하여 좋은 평가를 얻을 수 있습니다. 그런 다음 클립 거리를 사용하여 몇 개의 문자를 넣을 수 있는지 확인할 수 있습니다. 처음부터 부분 문자열을 가져 와서 (~ 2 ~ 3을 빼고 ...) 끝까지 넣으십시오.

새 문자열이 잘리지 않는지 확인하십시오 - 필요한 경우 일부 조정을 수행하십시오. 결국 WWWWWWWiiiiii를 가지고 있다면 그것을 조정해야 할 것입니다. 그러나이 모든 접근법은 꽤 빠를 것입니다.

0

, 당신은 elipsis 접미사를 포함, 당신은 표시 할 수있는 문자 확인하기 위해 이진 검색을 사용할 수 있습니다.

허용되는 공간에 맞는 부분 문자열 "..."을 찾을 때까지 N-1 문자, N-2, N-3 등을 시도하는 것과 비슷합니다. 그러나 선형 적으로 반복하기보다는 이진 탐색을 사용하여 더 적은 시도로 문자 수를 찾습니다.

-1
String cutString(String originalString, int placeholderWidth, FontMetrics fontMetrics) { 
    int stringWidth = fontMetrics.stringWidth(originalString); 
    String resultString = originalString; 

    while (stringWidth >= placeholderWidth) { 
     resultString = resultString.substring(0, resultString.length() - 4); 
     resultString = resultString.concat("..."); 
     stringWidth = fontMetrics.stringWidth(resultString); 
    } 

    return resultString; 
}