텍스트를 상자에 렌더링하고 초과분을 3 개의 점으로 바꾸는 방법
문제
나는 사용자 정의 테이블 셀 렌더러로 텍스트를 렌더링하고 현재 셀 너비를 초과하면 "이 텍스트는 길다 ..."표현으로 전환하는 경우 텍스트를 다듬고 싶습니다. 경계 상자를 떠나지 마십시오. 내 현재 알고리즘은 다음과 같습니다.
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);
}
제휴하지 않습니다 StackOverflow