我有一個相對容易的問題 - 但我找不到任何答案。繪製文本時,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;
}
我會推薦這個。 –