2013-08-30 3 views
1

Я использую поток для рисования некоторых анимаций, поэтому мне нужно перекрасить метку для каждого фрейма. Чтобы сделать это без мерцания, я обновляю метку с помощью графического объекта backbuffer (используя метод lbl.update (bufferedGraphics);), но когда я это делаю, ярлык перерисовывается в левом верхнем углу объекта Graphics, а не где setLocation.Позиция JLabel в Graphics при двойной буферизации

Как указать расположение метки внутри графики, а не внутри панели, которая владеет меткой?

Вот SSCCE:

import javax.swing.*; 
import java.awt.*; 

public class LabelSSCCE extends JApplet implements Runnable { 
JPanel pnl; 
JLabel lbl; 
Image buffer; 
Graphics bufferedGraphics; 
Thread t; 

public void init(){ 
    pnl = new JPanel (null); 
    lbl = new JLabel(); 

    lbl.setText ("Text"); 
    lbl.setOpaque(true); 

    add(pnl); 
    pnl.add (lbl); 
    lbl.setLocation(100, 100); 
    lbl.setBounds (100, 100, 200, 20); 

    buffer = createImage (500, 500); 
    bufferedGraphics = buffer.getGraphics(); 

    t = new Thread (this, "Label"); 
    t.start(); 
}// init method 

public void paint (Graphics g){ 
    if (g != null) 
     g.drawImage (buffer, 0, 0, this); 
}//paint 

public void update (Graphics g){ 
    paint (g); 
}//update 

public void render(){ 
    bufferedGraphics.setColor (Color.WHITE); 
    bufferedGraphics.fillRect (0, 0, 500, 500); 
    lbl.update (bufferedGraphics); 

    update(getGraphics()); 
}//render 

public void run(){ 
    while (true){ 
     try{ 
      render(); 
      t.sleep (20); 
     } catch (InterruptedException e){ 
      e.printStackTrace(); 
     }//catch 
    }//while 
}//run 
}//LabelSSCCE 

ответ

1

Во-первых, преобразовать JLabel в BufferedImage:

public BufferedImage componentToImage(Component component) 
{ 
    BufferedImage img = new BufferedImage(component.getWidth(), component.getHeight(), BufferedImage.TYPE_INT_ARGB_PRE); 
    Graphics g = img.getGraphics(); 
    g.setColor(component.getForeground()); 
    g.setFont(component.getFont()); 
    component.paintAll(g); 
    Rectangle region = new Rectangle(0, 0, img.getWidth(), img.getHeight()); 
    return img.getSubimage(region.x, region.y, region.width, region.height); 
} 

Затем измените метод визуализации на что-то вроде этого:

public void render() { 
    bufferedGraphics.setColor(Color.WHITE); 
    bufferedGraphics.fillRect(0, 0, 500, 500);  
    BufferedImage bi = componentToImage(lbl); 
    bufferedGraphics.drawImage(bi, lbl.getX(), lbl.getY(), null); 

    update(getGraphics()); 
} 
+0

Эта помещает все буферизованное изображение, где должна быть метка. Я хотел бы, чтобы белый прямоугольник фона, который я рисовал в рендере, все еще был на 0,0. В реальном приложении на этикетке есть куча рисунков, поэтому рисование всего объекта в середине страницы не решает проблему. – sideways8

+0

Хорошо, теперь я понимаю. Я обновил свой ответ. Я считаю, что это должно быть ближе к тому, что вы хотите. –

+1

Да, я сделал что-то похожее на это, спасибо! – sideways8

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