2012-11-13 62 views
0

我有一個相對容易的問題 - 但我找不到任何答案。繪製文本時,SWT表使用哪些文本邊距?

我在我的應用程序中使用了一個簡單的SWT表小部件,它只顯示單元格中的文本。我獲得了增量搜索功能,並且想要突出顯示所有單元格中的文本片段(如果它們匹配)。

所以當輸入「a」時,所有的「a」應該被突出顯示。

爲了得到這個,我添加了一個SWT.EraseItem偵聽器來干擾背景圖。如果當前單元格的文本包含搜索字符串,我找到位置並使用event.gc.stringExtent - 易於計算文本中的相對x座標。

因此,我只是在出現的「後面」繪製矩形。

現在,這裏有一個缺陷。該表不繪製沒有餘量的文本,所以我的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小部件,這可能是與操作系統有關。表格的實際「繪圖」是使用操作系統資源完成的。

但是,值得看看TableItem#getTextBounds(int)

它返回應該反映利潤率的Rectangle


爲了您的獎金問題:我從來沒見過文本正在我的應用程序會自動縮短。事實上,我自己很難做到這一點。但是這也可能取決於操作系統,因爲我使用Linux。

+0

哇,幾乎*做到了。嗯,它仍然只有一個像素。任何線索爲什麼會這樣?如果我從x中減去1,我就在現場。 *嘆*最後的縮短和替換「...」確實是在OS中完成的?當然? – Zordid

+0

@Zordid很確定。它將在Windows中縮短,但不會在Linux中縮短。我真的不知道,1px是從哪裏來的...如果應用程序只適用於Windows,我會建議引入一個'static final int'並將其設置爲'1'。如果您打算爲其他平臺發佈,請嘗試檢查它是否適用於沒有像素的平臺。 – Baz