2012-11-13 6 views
0

비교적 쉬운 질문이 있는데 어디서나 대답을 찾을 수는 없습니다.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; 
    } 

답변

3

TableViewer와 StyledCellLabelProvider을 살펴 보는 것이 매우 유용하다고 생각합니다. 그게 당신의 작업을 훨씬 쉽게 만들어 줄 것입니다. 당신이 필요로하는 종류의 텍스트 포맷을 생각해보십시오. 드로잉은 라벨 제공 업체가 완전히 처리하지 않기 때문에 이러한 성가신 여백 문제를 피할 수 있습니다.

+0

나는 이것을 또한 추천 할 것입니다. –

3

거의 모든 SWT 위젯은 OS에 따라 다를 수 있습니다. 테이블의 실제 "그리기"는 OS 리소스를 사용하여 수행됩니다.

그러나 TableItem#getTextBounds(int)을 살펴 보는 것이 좋습니다.

여백을 반영해야하는 Rectangle을 반환합니다.


보너스 질문 : 본인의 응용 프로그램에서 텍스트가 자동으로 짧아지는 것을 본 적이 없습니다. 사실 나는이 일을 혼자 힘들게했습니다. 그러나 리눅스를 사용하기 때문에 OS에 의존적 일 수도 있습니다.

+0

와우, 거의 * 거의 * 않습니다. 흠, 정확히 한 픽셀 씩 떨어져 있습니다. 왜 그럴 수 있겠 어? x에서 1을 빼면 그 자리에 있습니다. * 한숨 * 끝에 "..."을 줄이고 바꾸는 작업은 실제로 OS에서 수행됩니까 ?? 확실한? – Zordid

+0

@ Zordid 확실히. Windows에서는 단축되지만 Linux에서는 단축되지 않습니다. 1px가 어디서 왔는지는 모르겠다. 만약이 애플리케이션이 단지 윈도우를위한 것이라면, static final int를 도입하고 그것을 '1'로 설정할 것을 제안 할 것이다. 다른 플랫폼 용으로 출시하려는 경우 픽셀없이 작동하는지 확인하십시오. – Baz