텍스트를 상자에 렌더링하고 초과분을 3 개의 점으로 바꾸는 방법

StackOverflow https://stackoverflow.com/questions/1216043

  •  06-07-2019
  •  | 
  •  

문제

나는 사용자 정의 테이블 셀 렌더러로 텍스트를 렌더링하고 현재 셀 너비를 초과하면 "이 텍스트는 길다 ..."표현으로 전환하는 경우 텍스트를 다듬고 싶습니다. 경계 상자를 떠나지 마십시오. 내 현재 알고리즘은 다음과 같습니다.

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) 문자로 전환하기 전에?

도움이 되었습니까?

해결책

테이블의 기본 렌더러의 기본 동작 이므로이 작업을 수행하는 이유를 이해하지 못합니다.

그러나 나는 왼쪽의 도트 용 렌더러를 만들었습니다 ( "... 텍스트는 너무 길다"). 렌더러의 가능한 테두리와 intercell 간격을 고려하기 때문에 원하는 작업을 수행 할 수있는보다 완전한 방법을 보여줍니다. 렌더러. 확인하십시오 LeftDotrenderer.

다른 팁

원하는 효과를 달성하는 다른 방법을 생각할 수는 없지만 2 개의 DrawString () 호출을 하나로 교체 할 수 있어야합니다. 내가 Java를 작성한 지 오래되었지만 다음은 효과가 있다고 생각합니다.

BTW, 변수 이름을 변경하여 코드를 읽을 수 있습니다. :피

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);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top