在绘制文本时SWT表使用哪个文本边距?

时间:2012-11-13 10:57:11

标签: java swt fontmetrics custom-draw

我有一个相对容易的问题 - 但我找不到任何地方可以回答它。

我在我的应用程序中使用一个简单的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;
    }

2 个答案:

答案 0 :(得分:3)

对于几乎所有的SWT Widgets,这可能与操作系统有关。实际的&#34;绘图&#34;该表是使用OS资源完成的。

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

它返回一个应该反映边距的Rectangle


对于您的红利问题:我从未在应用程序中看到文本被自动缩短。事实上,我自己很难做到这一点。但这可能与操作系统有关,因为我使用的是Linux。

答案 1 :(得分:3)

我认为看看TableViewer和StyledCellLabelProvider会非常有用。考虑到您需要的文本格式,我认为这将使您的任务更容易。由于图纸完全由标签提供商处理,因此您可以避免这些讨厌的保证金问题。