Я использую поток для рисования некоторых анимаций, поэтому мне нужно перекрасить метку для каждого фрейма. Чтобы сделать это без мерцания, я обновляю метку с помощью графического объекта 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
Эта помещает все буферизованное изображение, где должна быть метка. Я хотел бы, чтобы белый прямоугольник фона, который я рисовал в рендере, все еще был на 0,0. В реальном приложении на этикетке есть куча рисунков, поэтому рисование всего объекта в середине страницы не решает проблему. – sideways8
Хорошо, теперь я понимаю. Я обновил свой ответ. Я считаю, что это должно быть ближе к тому, что вы хотите. –
Да, я сделал что-то похожее на это, спасибо! – sideways8