Heya!
Jeg har behov for at 'double buffer' en java.awt.Container. Jeg skal
ikke bruge den i en GUI, men Containeren skal converteres til en
java.lang.Image, da den senere skal converteres til GIF
Se lige dette kode:
------------
import java.awt.*;
import javax.swing.*;
public class Test extends JFrame
{
public static void main(String[] args)
{
new Test();
}
public Test()
{
JPanel panel = new JPanel();
Image image;
Graphics g;
Canvas canvas;
JLabel label;
addNotify(); // Create the peer
label = new JLabel("This is a test");
panel.setSize(280, 280);
panel.setBackground(Color.green);
panel.add(label);
image = createImage(280, 280);
g = image.getGraphics();
//panel.doLayout(); (NOTE 1)
panel.paint(g); // Paint the panel in the image
//label.paint(g); (NOTE 2)
getContentPane().add(new MyCanvas(image), BorderLayout.CENTER);
pack();
setVisible(true);
}
}
class MyCanvas extends Canvas
{
public MyCanvas(Image image)
{
setSize(280, 280);
this.image = image;
}
public void paint(Graphics g)
{
g.drawImage(image, 0, 0, this);
}
private Image image;
}
----------
Når programmet kører vises en 280x280 grøn skærm. Det beviser at panelet
(som tegnes grønt) er blevet konverteret til Image'et, da kun Image'et
bliver vist (panelet bliver aldrig vist direkte). Problemet er bare at
labelen ikke kommer med. Den er ellers added til panelet.
Hvorfor er jeg nødt til selv at kalde doLayout() (Note 1) for alle
nestede paneler, samt paint() på alle componenter? (Note 2)
- Morten Green Hermansen, Fanitas