비교적 쉬운 질문이 있는데 어디서나 대답을 찾을 수는 없습니다.SWT Table은 텍스트를 그릴 때 어떤 텍스트 여백을 사용합니까?
셀에 텍스트 만 표시하는 응용 프로그램에서 간단한 SWT 테이블 위젯을 사용합니다. 점진적 검색 기능이있어 일치하는 모든 셀에서 텍스트 스 니펫을 강조하고 싶습니다.
"a"를 입력 할 때 모든 "a"가 강조 표시되어야합니다.
이것을 얻으려면 SWT.EraseItem
청취자를 추가하여 배경 그림을 간섭 시키십시오. 현재 셀의 텍스트에 검색 문자열이 포함되어 있으면 위치를 찾고 텍스트 내에서 상대적인 x 좌표를 event.gc.stringExtent
- 쉽게 계산할 수 있습니다.
나는 방금 사각형을 "뒤"에 그립니다.
자, 여기에 결함이 있습니다. 표는 여백없이 텍스트를 그리지 않으므로 내 x 좌표는 실제로 일치하지 않습니다. 약간의 픽셀만큼 약간 떨어져 있습니다! 그러나 얼마나 많은 ?? 표 자체의 그림에서 사용할 셀의 텍스트 여백은 어디서 가져 옵니까? 실마리 없음. 아무것도 찾을 수 없습니다.
보너스 질문 : 표의 그리기 방법도 텍스트를 줄이고 셀에 맞지 않으면 "..."을 추가합니다. 흠. 내 어 발견 도구는 TableItem의 텍스트를 가져 와서 "..."에 의해 소비되기 때문에 실제로 보이지 않는 어커런스를 표시하려고합니다. EraseItem 그리기 처리기 내에 "실제"텍스트가 아니라 짧은 텍스트를 얻으려면 어떻게해야합니까?
@Override
public void handleEvent(final Event event) {
final TableItem ti = (TableItem) event.item;
final int index = event.index;
final GC gc = event.gc;
if(ti == null || currentSwyt.isEmpty()) {
return;
}
final String text = ti.getText(index);
if(!text.contains(currentSwyt)) {
return;
}
// search text is contained
final String[] parts = text.split(currentSwyt);
final int swytWidth = gc.stringExtent(currentSwyt).x;
// calculate positions, must be relative to the text's start
int x = event.x; // THIS IS THE PROBLEM: event.x is not enough!
final int[] pos = new int[parts.length - 1];
for(int i = 0; i < parts.length - 1; i++) {
x += gc.stringExtent(parts[i]).x;
pos[i] = x;
}
final Color red = event.display.getSystemColor(SWT.COLOR_RED);
final Color oldBackground = gc.getBackground();
gc.setBackground(red);
for(int j = 0; j < pos.length; j++) {
gc.fillRectangle(pos[j], event.y, swytWidth, event.height);
}
gc.setBackground(oldBackground);
event.detail &= ~SWT.BACKGROUND;
}
나는 이것을 또한 추천 할 것입니다. –