2009-08-18 2 views
1

Я работаю с приложением, в котором я добавляю тяжелый груз (Canvas) в JFrame. Canvas является сторонним компонентом, поэтому я должен держать его в тяжелом весе. Я хотел бы добавить возможности для пользователя рисовать на холсте и рисовать прямоугольник выделения.Рисунок на Java тяжеловесные колебательные компоненты

Я не думаю, что смогу сделать это со стеклянным стеклом, так как на стеклянном стекле будет показан тяжелый холст. Я попробовал добавить слушателя мыши на холст и рисовать непосредственно на его графике, но это, похоже, дает эффект «мерцания», поскольку это не легкий компонент с двойной буферизацией.

Есть ли способ достичь этого гладкого рисунка на тяжеловесных компонентах?

Это моя текущая попытка в методе окраски тяжеловесного компонента, но все еще мигает.

@Override 
    public void paint(Graphics g) 
    { 
     super.paint(g); 
     if (showUserSelection) 
     { 
      Point startDrawPoint = new Point(Math.min(startSelectPoint.x, 
        endSelectPoint.x), Math.min(startSelectPoint.y, 
        endSelectPoint.y)); 
      Point endDrawPoint = new Point(Math.max(startSelectPoint.x, 
        endSelectPoint.x), Math.max(startSelectPoint.y, 
        endSelectPoint.y)); 
      int w = endDrawPoint.x - startDrawPoint.x; 
      int h = endDrawPoint.y - startDrawPoint.y; 
      if (w > 0 && h > 0) 
      { 
       BufferedImage img = new BufferedImage(w, h, 
         BufferedImage.TYPE_INT_ARGB); 
       Graphics2D imgGraphics = img.createGraphics(); 
       imgGraphics.fillRect(0, 0, w, h); 
       g.drawImage(img, startDrawPoint.x, startDrawPoint.y, w, h, 
         null); 

      } 
     } 
    } 

ответ

2

Я не знаю о падении «Хост AWT/SWT в свинг» компонента, но вы должны быть в состоянии построить работу вокруг себя.

Вы считали, что используете двойную буферизацию?

Вы находитесь на 90% от своего кода, только с первого взгляда.

@Override 
public void paint(Graphics g) 
{ 
    BufferedImage buffer = new BufferedImage(COMPONENT_WIDTH, COMPONENT_HEIGHT, BufferedImage.TYPE_INT_ARGB); 

    Graphics bufferG = buffer.getGraphics(); 

    super.paint(bufferG); 
    if (showUserSelection) 
    { 
     Point startDrawPoint = new Point(Math.min(startSelectPoint.x, 
       endSelectPoint.x), Math.min(startSelectPoint.y, 
       endSelectPoint.y)); 
     Point endDrawPoint = new Point(Math.max(startSelectPoint.x, 
       endSelectPoint.x), Math.max(startSelectPoint.y, 
       endSelectPoint.y)); 
     int w = endDrawPoint.x - startDrawPoint.x; 
     int h = endDrawPoint.y - startDrawPoint.y; 
     if (w > 0 && h > 0) 
     { 
      bufferG.fillRect(startDrawPoint.x, startDrawPoint.y, w, h); 

     } 
    } 

    g.drawImage(buffer, 0, 0, null); 
} 
+0

спасибо. оцените помощь. Я думал, что я просто немного от него, и я думаю, что это приближает меня. –

Смежные вопросы