2011-03-12 3 views
0

수직 (위/아래)과 수평 (좌우) 슬라이드가 가능한 위젯을 만들고 싶습니다. 물론 사용자는이 위젯의 ​​스타일을 설정할 것입니다. 문제는 위젯을 수평 방향으로 오른쪽으로 밀어서 테스트 할 때 텍스트 뒤에 페인트 칠한 흔적이 남아 있다는 것입니다. 이 방법을 사용하면 텍스트를 칠할 수 있습니다.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!"); 
} 

누군가가 흔적에 어떤 문제가 있다고 말할 수 있습니까?

답변

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

먼저 자신의 메서드로 그리기 위해 gc 변수를 캐싱하는 것처럼 보입니다. 사용자 정의 페인팅을 볼 때마다 컴포지트에 추가 된 PaintListener의 paintControl (PaintEvent) 메소드에서 발생하고 gc는 각 반복시 PaintEvent에서 페치됩니다.

gc.drawText (...)는 단순히 대상 영역에 텍스트를 추가합니다. 텍스트를 직접 둘러싼 직사각형 만 배경색으로 채워집니다.

텍스트를 그리기 전에 배경색을 채우십시오. Here은 백그라운드에서 채워지는 swt 페인팅의 예이고 here은 여분의 단계를 거치고 이중 버퍼링을 사용하여 깜박임을 방지하는 예입니다.

+0

작동하지 않습니다. 벌써 해봤 어. –