swt中的图形问题

时间:2011-03-12 00:24:19

标签: java graphics swt

我想构建一个能够垂直(上下)和水平(左右)滑动的小部件。当然,用户将设置此小部件的样式。 问题是,当我用正确的方向水平滑动测试小部件时,文本留下了一些绘制的痕迹。使用这种方法我绘制文本:

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 :(得分:0)

首先,看起来您正在缓存gc变量,以便在您自己的方法中进行绘制。每当我看到自定义绘制时,它都会在添加到复合体中的PaintListener的paintControl(PaintEvent)方法中发生,并且每次迭代都会从PaintEvent中获取gc。

除此之外,gc.drawText(...)只是将文本添加到目标区域。只有直接围绕文本的矩形才会填充背景颜色。

在绘制文本之前尝试填充背景颜色。 Here是填充背景的swt绘画示例,here是一个额外步骤并使用双缓冲来防止闪烁的示例。

答案 1 :(得分:0)

这是我解决问题的方法。它很简单,但工作正常:

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!" );
}