2009-08-01 4 views
0

텍스트를 사용자 지정 테이블 셀 렌더러로 렌더링하고 현재 셀 너비를 초과하면 그릴 텍스트를 자르고 "이 텍스트는 긴 ... "종류의 표현을 사용합니다. 마지막 세 개의 점은 테두리 상자를 벗어나지 않습니다.상자에 텍스트를 렌더링하고 초과를 세 도트로 바꾸는 방법

FontMetrics fm0 = g2.getFontMetrics(); 
int h = fm0.getHeight(); 
int ellw = fm0.stringWidth("\u2026"); 
int titleWidth = fm0.stringWidth(se.title); 
if (titleWidth > getWidth()) { 
    for (int i = se.title.length() - 1; i > 0; i--) { 
     String tstr = se.title.substring(0, i); 
     int tstrw = fm0.stringWidth(tstr); 
     if (tstrw + ellw < getWidth()) { 
      g2.drawString(tstr, 2, h); 
      g2.drawString("\u2026", 2 + tstrw, h); 
      break; 
     } 
    } 
} else { 
    g2.drawString(se.title, 2, h); 
} 

결정하는 더 나은 방법이 있나요 얼마나 많은 문자를해야 내가 drawString()합니다 ... (U2026) 문자로 전환하기 전에 : 내 현재의 알고리즘은 다음과 같다?

답변

0

이것은 테이블의 기본 렌더러의 기본 동작이므로이 작업을 수행하는 이유를 잘 모르겠습니다.

하지만 왼쪽에있는 도트 ("... 텍스트가 너무 깁니다")에 대한 렌더러를 만들었습니다.이 렌더러는 렌더러에서 가능한 테두리를 고려하기 때문에 원하는 것을 수행하는보다 완벽한 방법을 보여줍니다. 렌더러의 셀 간 간격 LeftDotRenderer을 확인하십시오.

+0

감사합니다. 이유는 첫 번째 줄 (제목)이 16pt 텍스트로 그려지고 두 번째 줄과 세 번째 줄 (일부 세부 사항)이 셀 내에서 일반 텍스트로 그려지기 때문입니다. LeftDotRenderer는 주로 전체 문자열 너비 대신 문자 당 크기를 계산한다는 점에서 다릅니다. 나는 그것을 시험 할 것이다. – akarnokd

0

나는 원하는 효과를 얻기 위해 다른 방법을 생각할 수는 없지만, 2 개의 drawString() 호출을 하나의 것으로 대체 할 수 있어야한다. Java를 작성한 이후로 꽤 오래되었지만 다음과 같이 동작해야한다고 생각합니다.

나는 코드를 읽을 수 있도록 변수 이름을 변경했습니다. : p

FontMetrics metrics = g2.getFontMetrics(); 
int fontHeight = metrics.getHeight(); 
int titleWidth = metrics.stringWidth(se.title); 

if (titleWidth > getWidth()) { 
    String titleString; 

    for (int i = se.title.length() - 1; i > 0; i --) { 
     titleString = se.title.substring(0, i) + "\u2026"; 
     titleWidth = metrics.stringWidth(titleString); 

     if (titleWidth < getWidth()) { 
      g2.drawString(titleString, 2, fontHeight); 

      break; 
     } 
    } 
} else { 
    g2.drawString(se.title, 2, fontHeight); 
} 
관련 문제