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;
}

我认为看看TableViewer和StyledCellLabelProvider对您来说非常有用。这将使您的任务变得容易得多,我认为考虑到您需要的文本格式类型。由于图形完全由标签提供商处理,因此您可以避免这些讨厌的边距问题。

至于几乎所有的SWT小部件,这可能取决于操作系统。表的实际"绘制"是使用操作系统资源完成的。

但是,可能值得一看TableItem#getTextBounds(int).

它返回应反映边距的Rectangle


对于您的奖励问题:我从未见过在我的应用程序中自动缩短文本。事实上,我自己很难做到这一点。但这也可能取决于操作系统,因为我使用Linux。

相关内容

  • 没有找到相关文章

最新更新