我想构建一个能够垂直(上下)和水平(左右)滑动的小部件。当然,用户将设置此小部件的样式。 问题是,当我用正确的方向水平滑动测试小部件时,文本留下了一些绘制的痕迹。使用这种方法我绘制文本:
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!" );
}
有人能告诉我跟踪标记有什么问题吗?
答案 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!" );
}