有几种方法可以做到这一点。您可以保留一个 BufferedImages 列表作为您的图像层并相应地渲染它们:
class AdvancePaint extends JPanel(){
ArrayList<BufferedImage> layers;
//Other constructors, variables, initializations not shown
class AdvancePaint(){
layers = new ArrayList<BufferedImage>();
}
public void addLayer(BufferedImage layer){
layers.add(layer);
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
for(BufferredImage buf : layers) //render all layers
g.drawImage(buf, 0, 0, width, height, null);
}
}
以上代码将按照添加到列表中的顺序从列表中渲染 BufferedImage。如果您不想在每次重绘时都绘制所有图层,您可以随时添加另一个 draw(Graphics g) 方法,您可以选择要绘制到另一个 BufferedImage 上的图层。然后只在paintComponent(g)上绘制这个BufferedImage。
由于图层存储为Collection,因此您始终可以通过对它们进行排序或更改它们在列表中的位置来更改它们的渲染顺序。
您可以随时调整我示例中的小细节来定制您需要的内容。
添加图层:
BufferedImage layer = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
advancePaint.addLayer(layer);
使用BufferedImage.TYPE_INT_ARGB,背景将是透明的,因此其他图层将能够“透光”。