Графические проблемы в SWT - PullRequest
0 голосов
/ 12 марта 2011

Я хочу построить виджет, который будет способен скользить по вертикали (вверх и вниз) и по горизонтали (влево и вправо). Конечно, пользователь установит стили этого виджета. Проблема в том, что когда я тестирую виджет с горизонтальным скольжением в правильном направлении, текст оставляет позади какой-то нарисованный след. С помощью этого метода я рисую текст:

private void paintText ( )
{
    if ( getText ( ) != null )
    {
        Point point = gc.stringExtent ( getText ( ) );

        if ( isHorizontalSlide )
        {
            if ( getMode ( ) == LEFT_MODE )
            {
                if ( pX + point.x + 1 == rectangle.x )
                    pX = rectangle.width;
                gc.drawText ( getText ( ) , pX -- , pY );
            }
            else if ( getMode ( ) == RIGHT_MODE )
            {
                if ( pX == rectangle.width )
                    pX = rectangle.x - point.x + 1;
                gc.drawText ( getText ( ) , pX ++ , pY );
            }
            else
            {
                if ( pX + point.x + 1 == rectangle.x )
                    pX = rectangle.width;
                gc.drawText ( getText ( ) , pX -- , pY );
            }

        }
        else if ( isVerticalSlide )
        {

            if ( getMode ( ) == UP_MODE )
            {
                if ( pY + point.y + 1 == rectangle.y )
                    pY = rectangle.height;
                gc.drawText ( getText ( ) , pX , pY -- );
            }
            else if ( getMode ( ) == DOWN_MODE )
            {
                if ( pY == rectangle.height )
                    pY = rectangle.y - point.y + 1;
                gc.drawText ( getText ( ) , pX , pY ++ );
            }
            else
            {
                if ( pY + point.y + 1 == rectangle.y )
                    pY = rectangle.height;
                gc.drawText ( getText ( ) , pX , pY -- );
            }
        }
    }
    else
        throw new NullPointerException ( "The text cannot be null!" );
}

Может кто-нибудь сказать мне, в чем проблема с трассировкой?

Ответы [ 2 ]

0 голосов
/ 12 марта 2011

Это моё решение проблемы. Все просто, но отлично работает:

private void paintText ( )
{
    if ( getText ( ) != null )
    {
        Point point = gc.stringExtent ( getText ( ) );

        if ( isHorizontalSlide )
        {
            if ( getMode ( ) == LEFT_MODE )
            {
                if ( pX + point.x + 1 >= rectangle.x )
                    pX = rectangle.width;
                gc.drawText ( getText ( ) , pX -- , pY );
            }
            else if ( getMode ( ) == RIGHT_MODE )
            {
                if ( pX >= rectangle.width )
                    pX = rectangle.x - point.x + 1;
                gc.drawText ( getText ( ) , pX ++ , pY );
                Color color = gc.getForeground ( );
                gc.setForeground ( getBackground ( ) );
                gc.drawLine ( pX - 1 , pY , pX - 1 , point.y );
                gc.setForeground ( color );
            }
            else
            {
                if ( pX + point.x + 1 >= rectangle.x )
                    pX = rectangle.width;
                gc.drawText ( getText ( ) , pX -- , pY );
            }

        }
        else if ( isVerticalSlide )
        {

            if ( getMode ( ) == UP_MODE )
            {
                if ( pY + point.y + 1 >= rectangle.y )
                    pY = rectangle.height;
                gc.drawText ( getText ( ) , pX , pY -- );
            }
            else if ( getMode ( ) == DOWN_MODE )
            {
                if ( pY >= rectangle.height )
                    pY = rectangle.y - point.y + 1;
                gc.drawText ( getText ( ) , pX , pY ++ );
            }
            else
            {
                if ( pY + point.y + 1 >= rectangle.y )
                    pY = rectangle.height;
                gc.drawText ( getText ( ) , pX , pY -- );
            }
        }
    }
    else
        throw new NullPointerException ( "The text cannot be null!" );
}
0 голосов
/ 12 марта 2011

Во-первых, похоже, что вы кэшируете переменную gc, чтобы рисовать в своем собственном методе. Всякий раз, когда я видел пользовательское рисование, оно происходит в методе paintControl (PaintEvent) PaintListener, добавляемого в композит, и gc выбирается из PaintEvent на каждой итерации.

Кроме того, gc.drawText (...) просто добавляет текст в целевую область. Только прямоугольник, непосредственно окружающий текст, заливается цветом фона.

Попробуйте заполнить цвет фона перед рисованием текста. Здесь - это пример рисования SWT, который заполняет фон, а здесь - это пример, который делает дополнительный шаг и использует двойную буферизацию для предотвращения мерцания.

...